C++ 嵌套的静态链接库和一个可怕的Bug

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

(平台: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"

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)