CMake项目:从链接到主库的子库访问符号

时间:2018-10-15 08:56:43

标签: cmake linker static-libraries

我正在尝试重用CMake / Qt项目中的库,该项目构建可执行文件并链接到各种系统(已安装)库和作为项目一部分构建的静态库。该静态库本身是通过链接作为项目一部分而构建的许多其他库而构建的。

add_library(externallib STATIC
  ${SOURCES}
  //...
  ${OTHER_UIC_SOURCES}
)

target_link_libraries(externallib
  externallib-common
  ${SHA2_LIBRARIES}
  //...
  ${QTIOCOMPRESSOR_LIBRARIES}
  ${CMAKE_THREAD_LIBS_INIT}
  ${SQLITE_LIBRARIES}
)

然后通过以下方式创建可执行文件:

add_executable(externalapp main.cpp)
target_link_libraries(externalapp externallib)

我认为,通过链接到我自己的项目中的externallib,我还可以访问在其组成子库(这里是externallib-common)中定义的符号,但事实并非如此,当我尝试使用该undefined库中的方法时遇到externallib-common错误。当我也明确链接到这些错误时,这些错误就会消失。我肯定一定做错了吗?

这是我尝试过的:

find_library(EXTERNAL_LIB libexternal_lib.a ../externalapp/bin/src)

然后:

add_executable(${PROJECT} main.cpp ${QT_RESOURCES})

target_link_libraries(${PROJECT}
    ${QT_LIBRARIES}
    ${EXTERNAL_LIB}
}

然后在我的main.cpp中,我尝试使用子库中的函数(原始应用程序externapp的main.cpp中也使用了该函数),但是我得到了{ {1}}个错误。如果我明确添加,这些将消失:

undefined

find_library(EXTERNAL_COMMON_LIB libexternal-common.a ../externalapp/bin/ext/libexternal-common)

由于target_link_libraries(${PROJECT} ${QT_LIBRARIES} ${EXTERNAL_LIB} ${EXTERNAL_COMMON_LIB} } 已链接到EXTERNAL_COMMON_LIB,为什么我需要在EXTERNAL_LIB中显式添加它才能找到其符号,而在原始应用程序中却要链接到该符号主库足够吗?

我在这里想念什么?

感谢您的帮助!

0 个答案:

没有答案