【问题标题】:CMake unable to correctly link ultralight ui libraries to executable in Clion 2019.1.2CMake 无法将超轻 ui 库正确链接到 Clion 2019.1.2 中的可执行文件
【发布时间】:2026-02-03 10:25:01
【问题描述】:

您好,我正在尝试使用 Ultralight https://github.com/ultralight-ux/Ultralight 构建一个基本应用程序。但是,构建在链接阶段失败。我已经经历了很多其他的答案,但没有任何进展。

Cmake 错误:

C:/Users/AMWAJ-PC/Desktop/untitled1/main.cpp:10: undefined reference to `__imp__ZN10ultralight3App6CreateEv'

C:/Users/AMWAJ-PC/Desktop/untitled1/main.cpp:11: undefined reference to `__imp__ZN10ultralight6Window6CreateEPNS_7MonitorEjjbj'
C:/Users/AMWAJ-PC/Desktop/untitled1/main.cpp:14: undefined reference to `__imp__ZN10ultralight7Overlay6CreateENS_3RefINS_6WindowEEEjjii'
C:/Users/AMWAJ-PC/Desktop/untitled1/main.cpp:15: undefined reference to `__imp__ZN10ultralight6StringC1EPKc'
C:/Users/AMWAJ-PC/Desktop/untitled1/main.cpp:15: undefined reference to `__imp__ZN10ultralight6StringD1Ev'
C:/Users/AMWAJ-PC/Desktop/untitled1/main.cpp:15: undefined reference to `__imp__ZN10ultralight6StringD1Ev'

Cmakelist.txt

cmake_minimum_required(VERSION 3.14)
project(untitled1)
set(CMAKE_CXX_STANDARD 17)

set(INCLUDE_DIRS "C:/C++/ultralight_ui/include/")
set(LINK_DIRS "C:/C++/ultralight_ui/lib/")
include_directories("${INCLUDE_DIRS}")
find_library(
    ULTRA_LIB
    NAMES UltralightCore AppCore Ultralight WebCore
    HINTS "${LINK_DIRS}")

add_executable(untitled1 main.cpp)
target_link_libraries(untitled1 ${ULTRA_LIB})

main.cpp

#include <AppCore/App.h>
#include <AppCore/Window.h>
#include <AppCore/Overlay.h>

using namespace ultralight;

int main()
{

auto app = App::Create();
auto window = Window::Create(app->main_monitor(), 300, 300, false, kWindowFlags_Titled);
window->SetTitle("Tutorial 2 - Basic App");
app->set_window(window);
auto overlay = Overlay::Create(window, window->width(), window->height(), 0, 0);
overlay->view()->LoadHTML("<center>Hello World!</center>");
app->Run();

return 0;
}

任何帮助都会对我有好处:) 谢谢

【问题讨论】:

  • ultralib 真的是被 find_library 找到的吗?您可以将其设为 REQUIRED 或通过 message(${ULTRA_LIB}) 等打印出 ${ULTRA_LIB} 。我认为您可能也不应该将硬编码的绝对路径放在 CMakeLists 中。
  • 我建议向 Ultralight 提交功能请求以支持 cmake find_package(UltraLight) 并导出目标以方便使用。
  • 在调用find_package 后尝试在您的CMake 文件中打印${ULTRA_LIB} 的内容。这将显示变量是否已填充。试试这个:message(STATUS ${ULTRA_LIB})
  • @squareskittles:find_library 始终使用库文件的现有路径或 -NOTFOUND 值填充变量,CMake 永远不会忽略该值(与空值不同)。当 CMake 发现在 target_link_libraries 调用中使用的 NOTFOUND 值时,它甚至会发出警告。即使没有警告,链接器也会发出有关此类值的错误(因为它找不到具有给定名称的库)。

标签: c++ windows cmake clion


【解决方案1】:

您错误地将NAMES 参数用于find_library:此参数包含替代方法 的列表,而find_library 将仅生成单个库,该库具有这些名字之一。

如果您想找到多个库,则需要发出多个find_library 命令,每个命令都有自己的名称(和自己的变量):

find_library(
    ULTRA_LIB_CORE
    NAMES UltralightCore
    HINTS ${LINK_DIRS})

find_library(
    ULTRA_LIB_APP_CORE
    NAMES AppCore
    HINTS ${LINK_DIRS})

find_library(
    ULTRA_LIB
    NAMES Ultralight
    HINTS ${LINK_DIRS})

find_library(
    ULTRA_LIB_WEB_CORE
    NAMES WebCore
    HINTS ${LINK_DIRS})

...

target_link_libraries(untitled1
    ${ULTRA_LIB_CORE} ${ULTRA_LIB_APP_CORE} ${ULTRA_LIB} ${ULTRA_LIB_WEB_CORE}
)

【讨论】:

  • 那么你可能会错过一些需要的库。或者您的库与编译器不兼容(例如,已为 MinGW 创建了库,而您尝试将它们与 Visual Studio 一起使用)。
  • 是的 @Tsyvarev 库是为 msvc 创建的,我试图将它链接到 mingw。 c++ 编译器的名称修饰是错误的根源