大家好!
有一个任务
- 编写一个共享库(对于 windows .dll,对于 Linux .so)
- 库的头文件必须放在相应的文件夹中。(对于 Linux /usr/local/include/{library_name}/*)
- 应该可以在正在开发的应用程序中使用头文件。
目前我有 CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
set(PROJECT_VERSION "0.0.1")
project(mylib VERSION ${PROJECT_VERSION})
set(CMAKE_CXX_STANDARD 17)
include(CMakeSources.cmake)
add_library(mylib SHARED ${MY_LIB_HEADERS} ${MY_LIB_SOURCES})
set_target_properties(mylib PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION})
include(GNUInstallDirs)
set(MY_LIB_LIBRARY_DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(MY_LIB_HEADERS_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib)
INSTALL(TARGETS mylib
LIBRARY DESTINATION ${MY_LIB_LIBRARY_DESTINATION})
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
PUBLIC_HEADER DESTINATION ${MY_LIB_HEADERS_DESTINATION}
FILES_MATCHING PATTERN "*.h")
几乎可以满足所有要求。第 3 点有错误。
例如:我有两个头文件Ah和Bh,Bh包含Ah(#include "Ah")。
执行 make install 命令后,这些文件被移动到
- /usr/local/include/mylib/啊
- /usr/local/include/mylib/Bh
现在,当我尝试在另一个项目中使用 Bh 时,我得到了错误
/usr/local/include/mylib/Bh:1:致命错误:找不到“Ah”文件#include“Ah”
请帮我解决这个问题。
二选一:
或者
#include <mylib/A.h>
在您安装的标头中使用它。或者
-I/usr/local/include/mylib/
在编译其他项目时设置。在第一种情况下,为了在构建时使用相同的标头,您需要维护适当的项目结构:
原版大致分为
CMakeLists.txt
两部分:./CMakeLists.txt:
./mylib/CMakeLists.txt:
./mylib/CMakeSources.txt:
由于您的审美偏好或需要,您可以将一些命令移动到更低/更高。