如何指定头文件出台库的依赖(How to specify library dependency in

2019-07-02 19:34发布

假设在一个CMake的项目中,我有一个内置到库源

// a.cpp
void f() { /* some code*/ }

我有一个头

// b.h
void f();
struct X { void g() { f(); } };

我还有一个文件:

// main.cpp
#include "b.h"
int main() { X x; x.g(); }

该的CMakeLists.txt包含:

add_library(A a.cpp)
add_executable(main main.cpp)
target_link_libraries(main A)

现在看的CMakeLists.txt的最后一行:我需要指定一个作为主要明确的相关性。 基本上,我需要为每个包含BH由于包括可以是间接的和向下走,一路过关斩将链包括源指定这种依赖。 例如,a.cp​​p调用ch的一类内联函数,这在轮流DH调用功能等,并且如果BH是由大量的文件包括,手动找出所有这些依赖最后调用来自库A.功能是不是可行大型项目。

所以我的问题是,反正是有规定,对于每一个源文件直接或间接包括头,它需要对某些链接库?

谢谢。

Answer 1:

要明确一点:你a.cpp被编译成一个lib“A”。 这意味着,A的任何用户,将需要指定target_link_libraries与A.没有办法解决它。 如果您在使用一个10个的小应用程序,您将需要指定target_link_libraries十倍。

我的回答你的问题的第二个问题涉及,我相信这是更重要的一个:

如何摆脱链包括的?

通过在BH啊并利用其方法在波黑添加的是“隐性”的依赖。 正如您所注意到,波黑的任何用户需要啊为好。 一般来说,有两种方法。

好办法:

这有没有关系CMake的,但关于封装。 磁带库的用户(包括你自己)应该不需要担心它的内部实现。 这意味着:不要在BH啊

相反,将包括一个.cpp文件。 这样一来,你挣脱锁链。 例如像

// b.h
void f();
struct X
{ 
    void g();
};

// b.cpp
#include b.h
#include a.h
void X::g( )
{
    f();
}

使用你的资料库需要通过这种方式,使用的啊在cpp文件和任何人“载”只包含BH并链接到B.LIB。

另一种选择:

现在,还有,你必须接受这样的“依赖”或者是有意识的选择的情况。 例如,当你在无法控制,或当你有意识地决定建立在类定义的库/结构内部A.

在这种情况下,我建议你写一段代码的CMake,它准备所有必要的包含 - 迪尔斯环比下滑。 例如,定义一个变量“YOURLIB_INCLUDES”和“YOURLIB_LIBRARIES”在“YourLibConfig.cmake”和你的库中的任何用户应导入“YourLibConfig.cmake”的文件。 这是该方法基于几个CMake的项目需要。 如OpenCV的安装一个OpenCVConfig.cmake文件,VTK安装一个VTKConfig.cmake并准备UseVTK.cmake文件



文章来源: How to specify library dependency introduced by header file