CMake包含外部和自己的标头

问题描述

我有一个CMakelist.txt,其中添加了外部头文件和lib。我的构建文件。 现在,当我在主函数调用自定义标头(“ myown.h”)时,运行CMake链接时会出错。

所以我发现必须将自己的标头和.cpp添加到具有add_library的库中,然后将它们添加到target_link_libraries下。

但是,只要我想从自己的标题调用代码,我在构建时就会遇到链接错误

有人知道错误在哪里或如何继续吗? 这是我的CMakelist:

cmake_minimum_required(VERSION 3.0.0)
project(MIELE_OCULUS VERSION 0.1.0)

#Hier weden die include files gefunden
INCLUDE_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/include
)
#Hier werden die lib files gefunden
LINK_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib,C:/Program Files (x86)/Windows Kits/10/Lib/10.0.19041.0/um/x64
    
)
add_library(
    test
    testclass.h
    testclass.cpp
)
add_executable(MIELE_OCULUS 
    main.cpp
)

TARGET_LINK_LIBRARIES(MIELE_OCULUS 
    cpprest_2_10
    WS2_32
    test
)

更新:

通过CMakelist.txt中的这些更改,您可以构建程序,但是在更改src代码或清理CMake项目之后,将再次发生链接错误

更改的CMakelist:

cmake_minimum_required(VERSION 3.0.0)
project(MIELE_OCULUS VERSION 0.1.0)

add_library(
    mylib
    includes/mylib/testclass.h
    includes/mylib/testclass.cpp
)

#Hier weden die include files gefunden
TARGET_INCLUDE_DIRECTORIES(mylib PUBLIC 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
    $<INSTALL_INTERFACE:include/mylib>  # <prefix>/include/mylib

)

INCLUDE_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/include
    C:/Projekte/Cpp/dev/Miele_Oculus
)
#Hier werden die lib files gefunden
LINK_DIRECTORIES(
    C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib
    C:/Program Files (x86)/Windows Kits/10/Lib/10.0.19041.0/um/x64
    
)

add_executable(MIELE_OCULUS 
    main.cpp
)

TARGET_LINK_LIBRARIES(MIELE_OCULUS 
    cpprest_2_10
    WS2_32
    mylib
)

以下是详细输出

Der Buildvorgang wurde是01.11.2020 16:19:04 gestartet。 项目“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ ALL_BUILD.vcxproj” auf Knoten“ 1”(Standardziele)。 Das Projekt“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ ALL_BUILD.vcxproj”(1)erstert“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ b uild \ ZERO_CHECK.vcxproj“(2)auf Knoten” 1“(Standardziele)。 InitializeBuildStatus: “ x64 \ Debug \ ZERO_CHECK \ ZERO_CHECK.tlog \ unsuccessfulbuild”和“总是创建” angegeben wurde。 CustomBuild: Alle Ausgaben犯罪阿克图尔。 FinalizeBuildStatus: 死于Datei“ x64 \ Debug \ ZERO_CHECK \ ZERO_CHECK.tlog \ unsuccessfulbuild”与wirdgelöscht。 时间戳记“ x64 \ Debug \ ZERO_CHECK \ ZERO_CHECK.tlog \ ZERO_CHECK.lastbuildstate”。 Die Erstellung von Projekt“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ ZERO_CHECK.vcxproj”和abgeschlossen(Standardziele )。

Das Projekt“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ ALL_BUILD.vcxproj”(1)erstert“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ b uild \ MIELE_OCULUS.vcxproj“(3)auf Knoten” 1“(Standardziele)。 Das Projekt“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ MIELE_OCULUS.vcxproj”(3)erstert“ C:\ Projekte \ Cpp \ dev \ Miele_Oculu s \ build \ mylib.vcxproj“(4)auf Knoten” 1“(Standardziele)。 InitializeBuildStatus: 与“永远创建” angegeben wurde一起使用的“ mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild”。 CustomBuild: Alle Ausgaben犯罪阿克图尔。 VcpkgTripletSelection: 使用来自“ C:\ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows”的三元组“ x64-windows” ClCompile: Alle Ausgaben犯罪阿克图尔。 库: Alle Ausgaben犯罪阿克图尔。 mylib.vcxproj-> C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ mylib.lib AppLocalFromInstalled: C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe -ExecutionPolicy绕过-noprofile-文件“ C:\ Projekte \ Cpp \ d ev \ vcpkg \ scripts \ buildsystems \ msbuild \ applocal.ps1“” C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ mylib.lib“” C:\ Proj ekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ bin“” mylib.dir \ Debug \ mylib.tlog \ mylib.write.1u.tlog“” mylib.dir \ Debug \ vcpkg.applocal.log” FinalizeBuildStatus: 死于Datei“ mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild” wirdgelöscht。 时间戳记“ mylib.dir \ Debug \ mylib.tlog \ mylib.lastbuildstate”。 Die Erstellung von Projekt“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ mylib.vcxproj”和abgeschlossen(Standardziele)。

InitializeBuildStatus: 时间戳记“ MIELE_OCULUS.dir \ Debug \ MIELE_OCULUS.tlog \ successfulbuild”。 CustomBuild: Alle Ausgaben犯罪阿克图尔。 VcpkgTripletSelection: 使用来自“ C:\ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows”的三元组“ x64-windows” ClCompile: Alle Ausgaben犯罪阿克图尔。 链接: C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.27.29110 \ bin \ HostX64 \ x64 \ link.exe / ERR ORREPORT:队列/输出:“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ MIELE_OCULUS.exe” / INCREMENTAL / NOlogo / LIBPATH:“ C: / Projekte / Cpp / dev / vcpkg / installed / x64-windows / lib“ / LIBPATH:” C:/ Projekte / Cpp / dev / vcpkg / installed / x64-windows / lib / Debu g“ / LIBPATH:C:/ Program / LIBPATH:C:/ Program / Debug / LIBPATH:C:/ Projekte / Cpp / dev / Miele_Oculus / Files / LIBPATH:C:/ Projekte / Cpp / dev / Miele_Oculus / Files / Debug / LIBPATH:“ C:/ Projekte / Cpp / dev / Miele_Oculus /(” / LIBPATH:“ C:/ Projekte / Cpp / dev / Miele_O culus /(/ Debug“ / LIBPATH:C:/ Projekte / Cpp / dev / Miele_Oculus / x86 / LIBPATH:C:/ Projekte / Cpp / dev / Miele_Oculus / x86 / Debug / LIB 路径:“ C:/ Projekte / Cpp / dev / Miele_Oculus /)” / LIBPATH:“ C:/ Projekte / Cpp / dev / Miele_Oculus /)/ Debug” / LIBPATH:/ Windows / LIBP ATH:/ Windows / Debug / LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/Kits/10/Lib/10.0.19041.0/um/x64/LIBPATH:C:/ Projekte / Cpp /dev/Miele_Oculus/Kits/10/Lib/10.0.19041.0/um/x64/Debug / LIBPATH:“ C:\ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ deb ug \ lib“ / LIBPATH:” C:\ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ lib \ manual-link“ cpprest_2_10.lib WS2_32.lib Debug \ mylib.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.l ib advapi32.lib“ C:\ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ lib * .lib” / MANIFEST / MANIFESTUAC:“ level ='asIn voker'uiAccess ='false'“ / manifest:embedd / DEBUG /PDB:"C:/Projekte/Cpp/dev/Miele_Oculus/build/Debug/MIELE_OCULUS.pdb” / SUBSYstem:控制台/ TLBID:1 / DYNAMICBASE / NXCOMPAT / IMPLIB:“ C:/ Projekte / Cpp / dev / Miele_Oculus / build / Debug / MIELE_OCULUS .lib“ / MACHINE:X64 / machine:x64 MIELE_OCULUS.dir \ Debug \ main.obj 链接:致命错误LNK1104:Datei“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ MIELE_OCULUS.exe” kann nichtgeöffnetw 埃尔登。 [C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ MIELE_OCULUS.vcxproj] Die Erstellung des Projekts“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ MIELE_OCULUS.vcxproj”和abgeschlossen(Standardzi ele)-FEHLER。

Der Erstellung des Projekts“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ ALL_BUILD.vcxproj”和abgeschlossen(Standardziele )-FEHLER。

Fehler beim Buildvorgang。

“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ ALL_BUILD.vcxproj”(Standardziel)(1)-> “ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ MIELE_OCULUS.vcxproj”(Standardziel)(3)-> (链接Ziel)-> 链接:致命错误LNK1104:Datei“ C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ MIELE_OCULUS.exe” kann nichtgeöffnet werden。 [C:\ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ MIELE_OCULUS.vcxproj]

0 Warnung(en)
1 Fehler

Verstrichene Zeit 00:00:00.90

解决方法

现在可以了

1: 将头添加到add_library调用中不会添加头的包含目录。 您需要使用INCLUDE_DIRECTORIES手动添加这些目录,或者 TARGET_INCLUDE_DIRECTORIES

我添加了这一部分:

#Eigene header Dateien include
TARGET_INCLUDE_DIRECTORIES(mylib PUBLIC 
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/mylib>
$<INSTALL_INTERFACE:includes/mylib>  # <prefix>/includes/mylib

非常感谢Tsyvarev! :)

2:

“奇怪”的行为对我来说是一个严重的错误,因为我不知道我删除了Windows中的输出终端,而是在命令窗口中开始了新的构建

谢谢你们!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...