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
C++ 如何使cmakelists.txt编译使用在其他地方声明和实现的函数和类的cpp_C++_Cmake_Header Files - Fatal编程技术网

C++ 如何使cmakelists.txt编译使用在其他地方声明和实现的函数和类的cpp

C++ 如何使cmakelists.txt编译使用在其他地方声明和实现的函数和类的cpp,c++,cmake,header-files,C++,Cmake,Header Files,我在2个头文件中定义了一些函数类,并在某个文件夹中的cpp文件中实现了这些函数类。我将它们用于位于同一目录中的一些cpp程序(我们称之为cpp1.cpp)。让我们称之为dir1 现在我的问题是: 我有另一个dir2,与dir1的级别相同,它有自己的CMakeLists.txt,我试图在其中编译另一个位于dir2的cpp文件(我们称之为cpp2.cpp)。这个新的cpp使用或应该使用dir1头文件和cpp文件中声明和定义的一些函数和类。 在我的cpp2.cpp中,我正在做: #include "h

我在2个头文件中定义了一些函数类,并在某个文件夹中的cpp文件中实现了这些函数类。我将它们用于位于同一目录中的一些cpp程序(我们称之为cpp1.cpp)。让我们称之为dir1

现在我的问题是: 我有另一个dir2,与dir1的级别相同,它有自己的CMakeLists.txt,我试图在其中编译另一个位于dir2的cpp文件(我们称之为cpp2.cpp)。这个新的cpp使用或应该使用dir1头文件和cpp文件中声明和定义的一些函数和类。 在我的cpp2.cpp中,我正在做:

#include "header1_from_dir1.h"
#include "header2_from_dir1.h"
这给了我一个错误: 错误:“func_name”未在此作用域中声明func_name(参数1) ^~~~~~~~~~~~

当我尝试将其包含在相对路径中时,它会编译并正常工作:

#include "../dir1/header1_from_dir1.h"
#include "../dir1/header2_from_dir1.h"
为什么会这样?如何修改CMakelists.txt以正确“查看”dir1中定义的函数

简而言之,在CMakeLists中,我有:

include_directories(../dir1)
add_executable(cpp2 cpp2.cpp ../dir1/cpp_header1.cpp ../dir1/cpp_header2.cpp)
target_include_directories(cpp2 PUBLIC ./dir1)
target_link_libraries(some_library_from_another_place)
install(TARGETS cpp2 DESTINATION ${CMAKE_SOURCE_DIR}/bin/${TARGET_LOCATION})
目录结构:

.
|-- dir1
|   |-- bin
|   |-- build 
|   |-- header1_from_dir1.h
|   |-- header2_from_dir1.h
|   |-- cpp_header1.cpp
|   |-- cpp_header1.cpp
|   |-- cpp1.cpp       // this uses functions and clases from above files
|   `-- CMakeLists.txt // this is for above cpp1.cpp
|-- dir2
|   |-- bin
|   |-- build
|   |-- cpp2.cpp // this uses functions and clases from    
                 // dir1/cpp_header1.cpp
|   `-- CMakeLists.txt // this is for above cpp2.cpp and have briefly 
                       // described its contents
如何修改CMakelists.txt以正确“查看”dir1中定义的函数

可以按以下方式修改项目:

项目结构:
┣  从文件:

相对路径在INSTALL_接口表达式中是允许的,并且相对于安装前缀进行解释


因此,相对路径不是您想要的。您需要为它指定绝对路径,以便为编译正确解释。使用
CMAKE\u CURRENT\u SOURCE\u DIR
指定当前源目录的相对路径。

target\u include\u目录(cpp2 PUBLIC./dir1)
-您不是指
target\u include\u目录(cpp2 PUBLIC./dir1)
或更好的
target\u include\u目录(cpp2 PUBLIC${CMAKE\u CURRENT\u SOURCE\u DIR}//dir1)
我想说../dir1是正确的,因为我有一个用于编译/构建的脚本,并且我已经尝试使用${CMAKE_CURRENT_SOURCE_DIR}/./dir1,但有相同的错误消息:您的目录/文件结构是什么?你能展示/画它吗?哪里是
dir1
(或者有两个
dir1
?)尝试
target\u include\u目录(cpp2 PUBLIC${CMAKE\u CURRENT\u SOURCE\u DIR}/dir1)
这个CMakeLists.txt在哪里?它是在dir1中还是在dir2中还是在root中?为什么要调用
*include_directories()
两次?在本例中,这些调用是多余的。@squareskittles是的,您是对的,尽管删除并没有清除主要问题。我应该说我在使用cmake方面并不像你可能已经看到的那样先进。我已经改用cmake_CURRENT_SOURCE_DIR,但结果是一样的。消息调用显示两种使用方式的正确路径。另一方面,从include_目录中删除所需的文件不会像预期的那样打印我,因为它找不到包含的头文件。我看到的错误我只是解释为它找不到具有函数的对象。。。这听起来正确吗?
它找不到具有该功能的对象
-您没有源代码
cpp1.cpp
,请检查对象文件。老实说,为什么不从dir1链接到库呢?我只想
target\u link\u libraries(cpp2 PUBLIC cpp1)
asuming
dir1/CMakeLists.txt
以与dir2类似的方式添加库(cpp1)
。不幸的是,我不得不将CMakeLists.txt同时保存在dir1和dir2中,因为它们都在构建不同的应用程序。这是一个更大项目的一部分。我也在想,创建一个库将是一种更好的方法,可以将文件保存在两个目录中。只需确保在
dir2/CMakeLists.txt
中向现有目标添加一个新目标
cpp2
。是的,我将新目标添加为:add_executable(cpp2 cpp2.cpp../dir1/cpp_header1.cpp../dir1/cpp_header2.cpp)该命令的目标源是什么?在cmake doc网站上找到它,我似乎很高兴。