C++ 嵌套的静态链接库和一个可怕的Bug
(平台:C++14、Clang3.8、Ubuntu 16.04、CMake 3.5.1) 我有两个静态库(PawLIB、CalikoCat)和一个依赖于OtherLibrary的可执行文件。在CalkoCat中,只有一个类Dummy。(在我们开始认真开发这个库之前,我只是确保所有链接都正确。) 虚拟类当前依赖于来自PawLIB的函数进行测试C++ 嵌套的静态链接库和一个可怕的Bug,c++,cmake,c++14,static-linking,clang++,C++,Cmake,C++14,Static Linking,Clang++,(平台:C++14、Clang3.8、Ubuntu 16.04、CMake 3.5.1) 我有两个静态库(PawLIB、CalikoCat)和一个依赖于OtherLibrary的可执行文件。在CalkoCat中,只有一个类Dummy。(在我们开始认真开发这个库之前,我只是确保所有链接都正确。) 虚拟类当前依赖于来自PawLIB的函数进行测试 calikocat源代码/include/calikocat/dummy.hpp #include "pawlib/iochannel.hpp" clas
calikocat源代码/include/calikocat/dummy.hpp
#include "pawlib/iochannel.hpp"
class Dummy
{
public:
Dummy(){}
static void speak();
~Dummy(){}
};
#include "otherlibrary/dummy.hpp"
void Dummy::speak()
{
pawlib::ioc << "Hello, world!" << pawlib::io_end;
}
calikocat源代码/src/dummy.cpp
#include "pawlib/iochannel.hpp"
class Dummy
{
public:
Dummy(){}
static void speak();
~Dummy(){}
};
#include "otherlibrary/dummy.hpp"
void Dummy::speak()
{
pawlib::ioc << "Hello, world!" << pawlib::io_end;
}
现在,我喜欢在我的库中包含tester应用程序,这也不例外。在repo中,我将库和测试仪代码分为calikocat source
和calikocat tester
目录。我也使用CMake作为测试仪
calikocat测试仪/CMakeLists.txt
(代码片段)
编译和运行这个版本的工作和预期的一样,打印Hello,world代码>输出到终端两次
calikocat测试仪/main.cpp
,非工作版本
#include <calikocat/dummy.hpp>
#include <pawlib/iochannel.hpp>
int main()
{
pawlib::ioc << "Hello, world!" << pawlib::io_end;
Dummy::speak();
return 0;
}
#include <calikocat/dummy.hpp>
#include <pawlib/iochannel.hpp>
int main()
{
//pawlib::ioc << "Hello, world!" << pawlib::io_end;
Dummy::speak();
return 0;
}
#包括
#包括
int main()
{
//pawlib::ioc您应该尝试反转这两行:
target_link_libraries(${TARGET_NAME} ${PAWLIB_DIR}/lib/libpawlib.a)
target_link_libraries(${TARGET_NAME} ${CMAKE_HOME_DIRECTORY}/../calikocat-source/lib/$<CONFIG>/libcalikocat.a)
target\u link\u库(${target\u NAME}${PAWLIB\u DIR}/lib/libpawlib.a)
target_link_库(${target_NAME}${CMAKE_HOME_DIRECTORY}/./calikotsource/lib/$/libcalikota)
因为libcalikat.a使用的是libpawlib.a中的符号,它应该首先出现在命令行上。工作得很好,谢谢。因此,换句话说,如果D
依赖于C
,B
上的C
,以及a
上的B
,那么D
应该按照cba
的顺序链接。这就是e够容易了。
target_link_libraries(${TARGET_NAME} ${PAWLIB_DIR}/lib/libpawlib.a)
target_link_libraries(${TARGET_NAME} ${CMAKE_HOME_DIRECTORY}/../calikocat-source/lib/$<CONFIG>/libcalikocat.a)