cmake自建共享库中的Undefined Reference
Undefined Reference in self-built shared library with cmake
我目前正在尝试使用自建的共享库。 FooBar 库利用“Foo”库进行一些昂贵的计算。然而,“Foo”需要许可库“Bar”。使用如下CMakeLists.txt:
时已经交叉编译成功
cmake_minimum_required(VERSION 3.12)
project(FooBar LANGUAGES CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
find_library(Curl
NAMES curl)
find_library(Foo
NAMES foo)
find_library(Bar
NAMES bar)
file(GLOB OBJECT_FILES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/src/resources/*.o)
file(GLOB SOURCE_FILES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/src/*.cpp)
add_library(FooBar SHARED ${SOURCE_FILES} ${OBJECT_FILES})
target_link_libraries(FooBar PRIVATE Threads::Threads)
target_link_libraries(FooBar PRIVATE -L${Foo} -L${Bar} -L${Curl})
编译成功,没有任何错误,但是当我想将它包含在可执行文件中时,“FooBar”确实给了我一个未定义的引用,指向许可库“Bar”中的一个函数。我已经检查了“Bar”-library,它包含使用的功能!
CMakeLists.txt 可执行文件:
cmake_minimum_required(VERSION 3.12)
project(FooBarExe)
add_subdirectory(FooBar)
add_executable(FooBarExe ${FooBarExe_SRC} ${FooBarExe_INC}) # FooBarExe is just the placeholder for its original name!
target_link_libraries(FooBarExe PRIVATE FooBar)
错误信息:
"FooBarExe/FooBar/FooBar.so: undefined reference to 'function'
collect2: error: ld returned 1 exit status"
有没有人有解决这个问题的其他想法?我已经对 target_link_libraries 中的库进行了重新排序,将其编译为静态库,通过 set_target_properties 和 INTERFACE_LINK_LIBRARIES 将两个库包含并链接到 FooBarExe,但没有任何成功...
编辑:
我尝试了以下建议的解决方案:
- 添加库时删除“-L”
- 在 find_library(Bar ...)
之后添加了一个检查
我没有注意到“栏”库中的界面发生了变化。不得不更换头文件和库。使用 nm -gDC xxxx.so
命令深入查看库,发现更改。
谢谢大家的帮助,错误是我造成的...
我目前正在尝试使用自建的共享库。 FooBar 库利用“Foo”库进行一些昂贵的计算。然而,“Foo”需要许可库“Bar”。使用如下CMakeLists.txt:
时已经交叉编译成功cmake_minimum_required(VERSION 3.12)
project(FooBar LANGUAGES CXX)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
find_library(Curl
NAMES curl)
find_library(Foo
NAMES foo)
find_library(Bar
NAMES bar)
file(GLOB OBJECT_FILES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/src/resources/*.o)
file(GLOB SOURCE_FILES CONFIGURE_DEPENDS ${PROJECT_SOURCE_DIR}/src/*.cpp)
add_library(FooBar SHARED ${SOURCE_FILES} ${OBJECT_FILES})
target_link_libraries(FooBar PRIVATE Threads::Threads)
target_link_libraries(FooBar PRIVATE -L${Foo} -L${Bar} -L${Curl})
编译成功,没有任何错误,但是当我想将它包含在可执行文件中时,“FooBar”确实给了我一个未定义的引用,指向许可库“Bar”中的一个函数。我已经检查了“Bar”-library,它包含使用的功能!
CMakeLists.txt 可执行文件:
cmake_minimum_required(VERSION 3.12)
project(FooBarExe)
add_subdirectory(FooBar)
add_executable(FooBarExe ${FooBarExe_SRC} ${FooBarExe_INC}) # FooBarExe is just the placeholder for its original name!
target_link_libraries(FooBarExe PRIVATE FooBar)
错误信息:
"FooBarExe/FooBar/FooBar.so: undefined reference to 'function'
collect2: error: ld returned 1 exit status"
有没有人有解决这个问题的其他想法?我已经对 target_link_libraries 中的库进行了重新排序,将其编译为静态库,通过 set_target_properties 和 INTERFACE_LINK_LIBRARIES 将两个库包含并链接到 FooBarExe,但没有任何成功...
编辑: 我尝试了以下建议的解决方案:
- 添加库时删除“-L”
- 在 find_library(Bar ...) 之后添加了一个检查
我没有注意到“栏”库中的界面发生了变化。不得不更换头文件和库。使用 nm -gDC xxxx.so
命令深入查看库,发现更改。
谢谢大家的帮助,错误是我造成的...