【问题标题】:Library linked to a library which itself is linked to an application -> undefined reference链接到本身链接到应用程序的库的库 -> 未定义的引用
【发布时间】:2019-05-07 02:18:48
【问题描述】:

我正在研究我的问题几个小时,但我被困住了......

我有一个库 lib_1,其函数为 getNumber()
然后我有一个库 lib_2,其函数为 addNumbers()
addNumbers() 从 lib_1 调用 getNumber()

我的 CMakeLists.txt:

add_library( lib_1 STATIC IMPORTED )
set_target_properties(lib_1 PROPERTIES IMPORTED_LOCATION path_to_lib_1)

add_library( lib_2 STATIC lib2.cpp )
target_link_libraries( lib_2 lib_1 )
target_include_directories(lib_2 PUBLIC include )

lib_2 编译得很好,使用getNumber() 的单元测试也可以正常工作。

然后我想将 lib_2 链接到我的应用程序。

add_library( lib_1 STATIC IMPORTED )
set_target_properties(lib_1 PROPERTIES IMPORTED_LOCATION path_to_lib_1)

add_library( lib_2 STATIC IMPORTED )
set_target_properties(lib_2 PROPERTIES IMPORTED_LOCATION path_to_lib_2)

add_executable(app my_source_files )
target_link_libraries(app lib_1 lib_2)

当我编译我的应用程序时,我收到了这个众所周知的错误:
在来自 lib_2 的函数 addNumbers() 中,未定义对 getNumber() 的引用

我真的不明白,为什么它是一个未定义的引用?

顺便说一句,当我已经链接到本身静态链接到 lib_1 的 lib_2 时,我真的需要在我的应用程序中链接到 lib_1 吗?

【问题讨论】:

  • 订单很重要!如果lib_2 依赖于lib_1,则链接时lib_2 必须在之前 lib_1
  • “当我已经链接到 lib_2 时,我真的需要在我的应用程序中链接到 lib_1,而 lib_2 本身就是静态链接到 lib_1 的吗?” - 是的,你需要。与共享​​>库不同,静态库不包含有关链接库的信息。
  • Omfg,没想过要订购它们……谢谢,现在可以使用了……

标签: c++ cmake linker-errors static-linking


【解决方案1】:

正如在 cmets 中看到的那样,解决方案是静态链接库的正确顺序:

add_executable(app my_source_files )
target_link_libraries(app lib_2 lib_1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2020-08-10
    • 2011-12-08
    相关资源
    最近更新 更多