问题描述
我有一个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中的输出终端,而是在命令窗口中开始了新的构建
谢谢你们!