为不同的LIB包含相同的头文件 我有一个C++项目,其结构如下: CMakeLists.txt 代码/ libClient/ CMakeLists.txt 包括/ LibClient/ lib_client.h src/ lib_client.cpp libServer/ CMakeLists.txt 包括/ LibServer/ lib_server.h src/ lib_server.cpp libSDK/ 包括/ CMakeLists.txt LibSDK/ lib.h
我的根CMakeLists.txt包含以下内容:为不同的LIB包含相同的头文件 我有一个C++项目,其结构如下: CMakeLists.txt 代码/ libClient/ CMakeLists.txt 包括/ LibClient/ lib_client.h src/ lib_client.cpp libServer/ CMakeLists.txt 包括/ LibServer/ lib_server.h src/ lib_server.cpp libSDK/ 包括/ CMakeLists.txt LibSDK/ lib.h,c++,cmake,libs,C++,Cmake,Libs,我的根CMakeLists.txt包含以下内容: cmake_minimum_required(VERSION 3.0) project(libExample) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) add_subdirectory(code/libClient) add_subdirec
cmake_minimum_required(VERSION 3.0)
project(libExample)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
add_subdirectory(code/libClient)
add_subdirectory(code/libServer)
add_subdirectory(code/libSDK)
现在,我想将服务器和客户端的libs构建为.a
文件。lib_client.cpp
包含带有
#包括
到目前为止,我已经很清楚了,但是头文件lib_client.h
包括lib.h
,它位于/code/libSDK/include/libSDK/lib.h
,带有
#ifndef LIBCLIENT_H
#define LIBCLIENT_H
#include <string>
#include <LibSDK/lib.h>
我现在的问题是,是否有可能用硬编码的路径来避免这一行?此lib.h
也在本项目的其他头文件中使用(包括)
此lib.h的CMakelists.txt到目前为止只有以下内容:
cmake_minimum_required(VERSION 3.0)
project(LIBSDK)
我考虑过使用CMakefind_package()
方法并编写一个find.CMake
文件,但我看不出这有什么好处,因为在这个文件中我还必须编写路径
非常感谢。如果客户端库使用SDK库,您需要在客户端库的
CMakeLists.txt
中使用以下内容:
target_link_libraries(Client_lib SDK_lib)
这将告诉CMake客户端库使用SDK库。它还将自动使
公共
或接口
包含SDK_库上配置的路径(SDK_库的CMakeLists.txt中的目标
)可用于客户端_库。首先,如果您的libClient
和libServer
依赖于libSDK
,您应该重新排列顶级CMake,使其看起来如下所示。此外,根据示例项目结构,SDK的add_子目录()
应该是code/libSDK/include
:
cmake_minimum_required(VERSION 3.0)
project(libExample)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
add_subdirectory(code/libSDK/include)
add_subdirectory(code/libClient)
add_subdirectory(code/libServer)
您希望确保在遍历客户机和服务器目录之前,首先收集有关SDK的信息
其次,如果您不打算将libSDK
构建到库中,而只是使用它的头,那么您可以在libSDK
CMake文件中定义一个新变量来指定头的位置:
project(LIBSDK)
set(SDK_INCLUDE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "My SDK headers directory.")
现在,使用libSDK
目录中的缓存变量,我们可以在其他CMake文件中使用它:
project(LIBCLIENT)
add_library(Client_lib STATIC
src/lib_client.cpp
)
target_include_directories(Client_lib PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/include"
"${SDK_INCLUDE_DIRECTORY}"
)
project(LIBSDK)
set(SDK_INCLUDE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)
编辑:如前所述,为了避免使用缓存变量,您还可以使用设置include directories变量,使该变量可从客户端和服务器CMake文件访问:
project(LIBCLIENT)
add_library(Client_lib STATIC
src/lib_client.cpp
)
target_include_directories(Client_lib PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/include"
"${SDK_INCLUDE_DIRECTORY}"
)
project(LIBSDK)
set(SDK_INCLUDE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PARENT_SCOPE)
首先,感谢您的快速回复。在将行target_include_目录(Client_lib PUBLIC“${CMAKE_CURRENT_SOURCE_DIR}/include”)target_include_目录(Server_lib PUBLIC“${CMAKE_CURRENT_SOURCE_DIR}/include”)添加到lib.h的CMakeLists.txt之后,它现在正在工作,但我想了解建议的行target_链接_库(Client_lib SDK_lib)是什么可以,因为lib.h不应编译为lib,而应编译为服务器和客户端。您好。所以lib.h
是一个名为SDK\u lib
的库的一部分。这是一个所谓的库,因为它没有任何源文件可编译成.a
文件。但是任何公共
(或接口
)包含在此类目标上设置的路径(或某些其他属性)都会通过target\u link\u库
进行传播。现代CMake通常不鼓励使用缓存变量来实现这一点。最好为SDK_Lib
定义一个库,并在该目标上设置include路径(见上文)。@Mike.nl添加了使用缓存变量的替代方法。同意为这个SDK定义一个接口库是更好的做法,但是OP描述了lib.h
不应该作为库的一部分引入。在不完全了解OP对SDK的使用的情况下,我试图让我的解释尽可能简单。