如何使用 CMake link.so 文件
how to link .so files with CMake
我想重建一个基于 .cpp、一个 .h 和多个 .so 文件的简单应用程序。据我所见,我的 CMakeLists.txt 应该是这样的:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(test C CXX)
add_executable(${PROJECT_NAME} main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)
target_link_libraries(test ${CMAKE_SOURCE_DIR}/libA.so ${CMAKE_SOURCE_DIR}/libB.so)
所有文件都在同一个文件夹中。我之前 link 使用我的 .h 文件正确编辑了我的 .cpp。 cmake .
没有给我任何错误,但是在使用 make
之后我得到:
main.cpp:(.text+0xf2d) : undefined reference to « pthread_create »
这是一个不属于我的 .h 文件的函数,因此它应该在 .so 文件中。我不知道问题是来自 link 还是文件 .so 本身。
我也有同名文件,例如 libA.so、libA.so.0 或 libA.so.0.2,我应该将所有这些文件都包含在我的可执行文件中吗?
错误消息意味着您必须将pthread
添加到链接库列表中。在 target_link_libraries
中,您只列出没有路径、lib
前缀和文件扩展名的库名称:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(test C CXX)
find_package(Threads REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)
target_link_libraries(test A B Threads::Threads)
您可以添加路径 target_link_directories
:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(test C CXX)
find_package(ThreadsREQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)
target_link_directories(test PRIVATE ${CMAKE_SOURCE_DIR})
target_link_libraries(test PRIVATE A B Threads::Threads)
最好的方法是定义代表库的相应目标。
add_library(externalLibA SHARED IMPORTED)
set_target_properties(externalLibA
PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libA.so)
target_include_directories(externalLibA
INTERFACE ${CMAKE_SOURCE_DIR}/lib)
然后将此目标添加为目标的依赖项。
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC externalLibA)
我想重建一个基于 .cpp、一个 .h 和多个 .so 文件的简单应用程序。据我所见,我的 CMakeLists.txt 应该是这样的:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(test C CXX)
add_executable(${PROJECT_NAME} main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)
target_link_libraries(test ${CMAKE_SOURCE_DIR}/libA.so ${CMAKE_SOURCE_DIR}/libB.so)
所有文件都在同一个文件夹中。我之前 link 使用我的 .h 文件正确编辑了我的 .cpp。 cmake .
没有给我任何错误,但是在使用 make
之后我得到:
main.cpp:(.text+0xf2d) : undefined reference to « pthread_create »
这是一个不属于我的 .h 文件的函数,因此它应该在 .so 文件中。我不知道问题是来自 link 还是文件 .so 本身。
我也有同名文件,例如 libA.so、libA.so.0 或 libA.so.0.2,我应该将所有这些文件都包含在我的可执行文件中吗?
错误消息意味着您必须将pthread
添加到链接库列表中。在 target_link_libraries
中,您只列出没有路径、lib
前缀和文件扩展名的库名称:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(test C CXX)
find_package(Threads REQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)
target_link_libraries(test A B Threads::Threads)
您可以添加路径 target_link_directories
:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(test C CXX)
find_package(ThreadsREQUIRED)
add_executable(${PROJECT_NAME} main.cpp)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/lib)
target_link_directories(test PRIVATE ${CMAKE_SOURCE_DIR})
target_link_libraries(test PRIVATE A B Threads::Threads)
最好的方法是定义代表库的相应目标。
add_library(externalLibA SHARED IMPORTED)
set_target_properties(externalLibA
PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libA.so)
target_include_directories(externalLibA
INTERFACE ${CMAKE_SOURCE_DIR}/lib)
然后将此目标添加为目标的依赖项。
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC externalLibA)