Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为不同的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 - Fatal编程技术网

为不同的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

为不同的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

我的根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_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)
我考虑过使用CMake
find_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的使用的情况下,我试图让我的解释尽可能简单。