【发布时间】:2019-05-15 09:18:37
【问题描述】:
我是 C/C++ 开发新手,在 CLion IDE 中处理 CMakeLists.txt 时遇到了困难。
我无法创建可以在另一个程序中#include 的库(静态或共享)。
我有这种结构:
src/
|
|---> utilities/
| |---> CMakeLists.txt
| |---> utilties.h
| |
| |---> file_utilities/
| | |---> file_utilities.h
| | |---> file_utilities.c
| ...
|
|---> my_app
|---> CMakeLists.txt
|---> main.c
我已经生成了一个 libutilities.so 和一个 libutilities.a。在我的 main.c 文件中,如果我执行 #include "../utilities/utilities.h" 或 #include "../utilities/file_utilities/file_utilities.h",它就可以工作。
更糟糕的是,如果我使用另一个程序创建另一个项目并链接我的 libutilities.so,链接似乎有效,但仍然无法包含我的标题。
我在 CMakeLists.txt 中尝试了许多配置、许多选项,但直到现在都没有成功。
这是我用于我的库的 CMakeLists.txt。我很确定问题出在这个文件中。
cmake_minimum_required(VERSION 3.7)
project(utilities VERSION 1.0.0)
set(CMAKE_CXX_STANDARD 11)
link_libraries(pthread)
link_libraries(ssl)
link_libraries(crypto)
find_package(CURL REQUIRED)
include_directories(${CURL_INCLUDE_DIRS})
file(GLOB_RECURSE SOURCES RELATIVES "*.c")
file(GLOB_RECURSE HEADERS RELATIVES "*.h")
add_library(${PROJECT_NAME} SHARED ${SOURCES} ${HEADERS})
set_target_properties(${PROJECT_NAME} PROPERTIES
PUBLIC_HEADER "${HEADERS}"
ARCHIVE_OUTPUT_DIRECTORY "lib"
LIBRARY_OUTPUT_DIRECTORY "lib"
OUTPUT_NAME ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} PUBLIC .)
target_link_libraries(${PROJECT_NAME} ${CURL_LIBRARIES})
include(GNUInstallDirs)
install(TARGETS ${PROJECT_NAME}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
我想拥有更像#include <utilities/utilties.h> 的东西,因为它是一个库。但我不能让它工作。
在我提供的示例中,该库是一个简单的“utils”库,但我必须创建更多的东西,我必须交付并集成到我的另一个程序中。
【问题讨论】:
-
最好为
target_include_directories提供绝对路径。根据documentation,仅$<INSTALL_INTERFACE>表达式允许相对路径。您没有显示my_app/CMakeLists.txt脚本。但假设它有target_link_libraries(<exe> utilities),事情应该可以工作。 -
这更好,但它仍然无法按我的意愿工作。在当前项目中,我现在可以
#include <utilities.h>,或者直接#include <file_utilities/file_utilities.h>。但是我仍然不能在我的 .so 或 .a 库的另一个程序中使用它。我可以使用那些内置在 cmake-build-debug 文件夹中的吗? -
如果你想为其他项目提供头文件,通常的方法是安装那些头文件。然后,在另一个项目中,您只需将目录调整到该安装位置。您可能会发现 CMake packaging tutorial 对您的目的很有用。
-
我只建议像现在一样使用
add_library(utilities),然后在my_app/CMakeLists.txt中添加add_subdirectory(utlities ${CMAKE_CURRENT_SOURCE_DIR}/../utilities)和简单的target_link_libraries(my_app PUBLIC utilities)。不需要install(),它比简单的add_library()更难维护。
标签: c cmake shared-libraries static-libraries