目前,我尝试制作ImGuiConfig.cmake文件,以便使用亲爱的ImGui图形用户界面库。
我想从外部项目中使用如下库。
find_package(ImGui REQUIRED)
add_executable(hello hello.cpp)
target_link_libraries(hello ${IMGUI_LIBRARIES})下面是我为安装CMakeLists.txt库而编写的一个文件。
cmake_minimum_required(VERSION 3.10)
# Project Name
project(ImGui)
# This cmake file try to make a lib of ImGui glfw backend
add_definitions(-fPIC)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
# Get header and source file name
file(GLOB_RECURSE SOURCE_CPP RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ImGui/*.cpp)
file(GLOB_RECURSE SOURCE_HEADER RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ImGui/*.h)
# create target
add_library(${PROJECT_NAME} STATIC ${SOURCE_CPP})
target_link_libraries(${PROJECT_NAME} PUBLIC glfw GLEW GL)
set_target_properties(${PROJECT_NAME} PROPERTIES IMPORTED_LINK_LIBRARIES "glfw;GLEW;GL")
set_target_properties(${PROJECT_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES "glfw;GLEW;GL")
install(TARGETS ${PROJECT_NAME}
EXPORT ImGuiConfig
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
export(TARGETS ${PROJECT_NAME}
FILE "${CMAKE_CURRENT_BINARY_DIR}/ImGuiConfig.cmake")
install(EXPORT ImGuiConfig
DESTINATION lib/cmake/ImGui
EXPORT_LINK_INTERFACE_LIBRARIES
)但是,当我使用ImGui库编写外部程序时,会出现以下错误。
harumo@harumo-thinkpad-x1:~/program/cpp/imgui/hello/build$ make
Scanning dependencies of target hello
[ 50%] Building CXX object CMakeFiles/hello.dir/hello.cpp.o
[100%] Linking CXX executable hello
CMakeFiles/hello.dir/hello.cpp.o: In function `main':
hello.cpp:(.text+0x32): undefined reference to `glfwWindowHint'
hello.cpp:(.text+0x41): undefined reference to `glfwWindowHint'
hello.cpp:(.text+0x50): undefined reference to `glfwWindowHint'
hello.cpp:(.text+0x5f): undefined reference to `glfwWindowHint'
hello.cpp:(.text+0x82): undefined reference to `glfwCreateWindow'
hello.cpp:(.text+0x8f): undefined reference to `glfwMakeContextCurrent'
hello.cpp:(.text+0x99): undefined reference to `glfwSwapInterval'
hello.cpp:(.text+0x9e): undefined reference to `glewInit'
hello.cpp:(.text+0xd3): undefined reference to `ImGui::DebugCheckVersionAndDataLayout(char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)'
hello.cpp:(.text+0xe1): undefined reference to `ImGui::CreateContext(ImFontAtlas*)'
hello.cpp:(.text+0xea): undefined reference to `ImGui::GetIO()'
hello.cpp:(.text+0xf9): undefined reference to `ImGui::StyleColorsLight(ImGuiStyle*)'
hello.cpp:(.text+0x107): undefined reference to `ImGui_ImplGlfw_InitForOpenGL(GLFWwindow*, bool)'
hello.cpp:(.text+0x113): undefined reference to `ImGui_ImplOpenGL3_Init(char const*)'
hello.cpp:(.text+0x147): undefined reference to `glfwWindowShouldClose'
hello.cpp:(.text+0x155): undefined reference to `glfwPollEvents'
hello.cpp:(.text+0x15a): undefined reference to `ImGui_ImplOpenGL3_NewFrame()'
hello.cpp:(.text+0x15f): undefined reference to `ImGui_ImplGlfw_NewFrame()'
hello.cpp:(.text+0x164): undefined reference to `ImGui::NewFrame()'
hello.cpp:(.text+0x179): undefined reference to `ImGui::Begin(char const*, bool*, int)'
hello.cpp:(.text+0x18d): undefined reference to `ImGui::Text(char const*, ...)'
hello.cpp:(.text+0x1a4): undefined reference to `ImGui::Checkbox(char const*, bool*)'
hello.cpp:(.text+0x1ac): undefined reference to `ImGui::End()'
hello.cpp:(.text+0x1b1): undefined reference to `ImGui::Render()'
hello.cpp:(.text+0x1dc): undefined reference to `glfwGetFramebufferSize'
hello.cpp:(.text+0x1f0): undefined reference to `glViewport'
hello.cpp:(.text+0x209): undefined reference to `glClearColor'
hello.cpp:(.text+0x213): undefined reference to `glClear'
hello.cpp:(.text+0x218): undefined reference to `ImGui::GetDrawData()'
hello.cpp:(.text+0x220): undefined reference to `ImGui_ImplOpenGL3_RenderDrawData(ImDrawData*)'
hello.cpp:(.text+0x229): undefined reference to `glfwSwapBuffers'
hello.cpp:(.text+0x233): undefined reference to `ImGui_ImplOpenGL3_Shutdown()'
hello.cpp:(.text+0x238): undefined reference to `ImGui_ImplGlfw_Shutdown()'
hello.cpp:(.text+0x241): undefined reference to `ImGui::DestroyContext(ImGuiContext*)'
hello.cpp:(.text+0x24a): undefined reference to `glfwDestroyWindow'
hello.cpp:(.text+0x24f): undefined reference to `glfwTerminate'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
CMakeFiles/hello.dir/build.make:100: recipe for target 'hello' failed
make[2]: *** [hello] Error 1
CMakeFiles/Makefile2:92: recipe for target 'CMakeFiles/hello.dir/all' failed
make[1]: *** [CMakeFiles/hello.dir/all] Error 2
Makefile:100: recipe for target 'all' failed
make: *** [all] Error 2似乎glfw、GLEW和GL库没有被导入。
如果你告诉我如何用上面的CMakeLists.txt导入glfw,GLEW和GL库,我很高兴。如果你需要更多的信息,请告诉我。
提前谢谢。
溶液
多亏了Tsyvarev非常恰当的评论,我才能解决这个问题。我更改了我的CMakeLists.txt如下。
cmake_minimum_required(VERSION 3.10)
# Project Name
project(ImGui)
# This cmake file try to make a lib of ImGui glfw backend
add_definitions(-fPIC)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
# Get header and source file name
file(GLOB_RECURSE SOURCE_CPP RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ImGui/*.cpp)
file(GLOB_RECURSE SOURCE_HEADER RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ImGui/*.h)
# create target
add_library(${PROJECT_NAME} STATIC ${SOURCE_CPP})
target_link_libraries(${PROJECT_NAME} PUBLIC glfw GLEW GL)
set_target_properties(${PROJECT_NAME} PROPERTIES IMPORTED_LINK_LIBRARIES "glfw;GLEW;GL")
set_target_properties(${PROJECT_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES "glfw;GLEW;GL")
set(IMGUI_LIBRARIES ImGui;glfw;GLEW;GL)
install(TARGETS ${PROJECT_NAME}
EXPORT ImGuiConfig
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
export(TARGETS ${PROJECT_NAME}
FILE "${CMAKE_CURRENT_BINARY_DIR}/ImGuiConfig.cmake")
install(EXPORT ImGuiConfig
DESTINATION lib/cmake/ImGui
EXPORT_LINK_INTERFACE_LIBRARIES
)我刚加入我的CMakeLists.txt
set(IMGUI_LIBRARIES ImGui;glfw;GLEW;GL)通过添加这一行,我定义了一个名为IMGUI_LIBRARIES的CMAKE变量。该变量的内容为ImGui;glfw;GLEW;GL。这允许用户通过执行以下操作来加载必要的库,如glfw、GLEW和GL。
target_link_libraries(hello ${IMGUI_LIBRARIES})发布于 2021-08-16 07:37:02
谢谢Tsyvarev!
你的评论很有用。我更改了我的CMakeLists.txt如下。
cmake_minimum_required(VERSION 3.10)
# Project Name
project(ImGui)
# This cmake file try to make a lib of ImGui glfw backend
add_definitions(-fPIC)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)
# Get header and source file name
file(GLOB_RECURSE SOURCE_CPP RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ImGui/*.cpp)
file(GLOB_RECURSE SOURCE_HEADER RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ImGui/*.h)
# create target
add_library(${PROJECT_NAME} STATIC ${SOURCE_CPP})
target_link_libraries(${PROJECT_NAME} PUBLIC glfw GLEW GL)
set_target_properties(${PROJECT_NAME} PROPERTIES IMPORTED_LINK_LIBRARIES "glfw;GLEW;GL")
set_target_properties(${PROJECT_NAME} PROPERTIES INTERFACE_LINK_LIBRARIES "glfw;GLEW;GL")
set(IMGUI_LIBRARIES ImGui;glfw;GLEW;GL)
install(TARGETS ${PROJECT_NAME}
EXPORT ImGuiConfig
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
export(TARGETS ${PROJECT_NAME}
FILE "${CMAKE_CURRENT_BINARY_DIR}/ImGuiConfig.cmake")
install(EXPORT ImGuiConfig
DESTINATION lib/cmake/ImGui
EXPORT_LINK_INTERFACE_LIBRARIES
)我刚加入我的CMakeLists.txt
set(IMGUI_LIBRARIES ImGui;glfw;GLEW;GL)https://stackoverflow.com/questions/61221054
复制相似问题