假设在一个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.cpp调用ch的一类内联函数,这在轮流DH调用功能等,并且如果BH是由大量的文件包括,手动找出所有这些依赖最后调用来自库A.功能是不是可行大型项目。
所以我的问题是,反正是有规定,对于每一个源文件直接或间接包括头,它需要对某些链接库?
谢谢。
要明确一点:你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
文件