【问题标题】:ld: symbol(s) not found for architecture x86_64 (CMake SFGUI)ld:未找到架构 x86_64 的符号(CMake SFGUI)
【发布时间】:2016-12-09 11:12:06
【问题描述】:

我正在尝试使用 SFML 和 SFGUI 构建一个项目。该项目一直在构建,直到我尝试实例化 sfg::SFGUI。当我尝试时,我收到以下错误:

/Applications/CLion.app/Contents/bin/cmake/bin/cmake -E cmake_link_script CMakeFiles/tilemap.dir/link.txt --verbose=1
/usr/bin/clang++    -std=c++11 -stdlib=libc++ -g -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/tilemap.dir/src/main.cpp.o CMakeFiles/tilemap.dir/src/Camera.cpp.o CMakeFiles/tilemap.dir/src/Player.cpp.o CMakeFiles/tilemap.dir/src/Tile.cpp.o CMakeFiles/tilemap.dir/src/TileMap.cpp.o  -o tilemap /usr/local/lib/libsfml-system.dylib /usr/local/lib/libsfml-window.dylib /usr/local/lib/libsfml-graphics.dylib /usr/local/lib/libsfml-network.dylib /usr/local/lib/libsfml-audio.dylib 
Undefined symbols for architecture x86_64:
  "sfg::SFGUI::SFGUI()", referenced from:
      MyInterface::MyInterface() in main.cpp.o
  "sfg::SFGUI::~SFGUI()", referenced from:
      MyInterface::~MyInterface() in main.cpp.o
ld: symbol(s) not found for architecture x86_64

这是我的“MyInterface.h”:

#include <iostream>
#include <stdlib.h>
#include <SFGUI/SFGUI.hpp>
#include <SFGUI/Widgets.hpp>
#include <SFML/Graphics.hpp>

class MyInterface {
public:
    void RunInterface();
    void ButtonClick();

private:
    sfg::SFGUI mysfgui;
    // sfg::Window::Ptr m_window;
    // sfg::Button::Ptr m_button;
};

void MyInterface::RunInterface() {
    printf("Interface running!\n");
    // m_window = sfg::Window::Create();
    // auto box = sfg::Box::Create( sfg::Box::Orientation::VERTICAL, 5.f );
    // m_button = sfg::Button::Create( "Click me" );
    // box->Pack( m_button );
    // m_button->GetSignal( sfg::Widget::OnLeftClick ).Connect( std::bind( &MyInterface::ButtonClick, this ) );
}

void MyInterface::ButtonClick() {
    // m_button->SetLabel( "I was clicked" );
}

如您所见,除了 SFGUI 实例化之外,我已将所有内容都注释掉了。

这是我的 CMake 文件的样子:

cmake_minimum_required(VERSION 3.5)
# Project Specific stuff
set(SOURCE_FILES src/main.cpp src/Camera.cpp src/Player.cpp src/Tile.cpp src/TileMap.cpp src/MyInterface.h)
set(PROJECT_NAME myproject)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
message("Building ${PROJECT_NAME}...")
project(${PROJECT_NAME})

# CMake Options
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
if (APPLE)
    message("Found Apple Machine!")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -stdlib=libc++")
    set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
    set(CMAKE_C_COMPILER "/usr/bin/clang")
endif (APPLE)

# SFML Stuff
find_package(SFML REQUIRED system window graphics network audio)
if (SFML_FOUND)
    message("Found SFML...")
    include_directories(${SFML_INCLUDE_DIR} ${SFML_INCLUDE_DIRS}) # Do I need dir and dirs?
    target_link_libraries(${PROJECT_NAME} ${SFML_LIBRARIES} ${SFML_DEPENDENCIES})
else ()
    message(FATAL_ERROR "Could not locate SFML!")
endif (SFML_FOUND)

# SFGUI Stuff
find_package(SFGUI REQUIRED window button widget)
if (SFGUI_FOUND)
    message("Found SFGUI...")
    include_directories(${SFGUI_INCLUDE_DIR} ${SFGUI_INCLUDE_DIRS}) # Do I need dir and dirs?
    target_link_libraries(${PROJECT_NAME} ${SFGUI_LIBRARIES} ${SFGUI_DEPENDENCIES})
else ()
    message(FATAL_ERROR "Could not locate SFGUI!")
endif (SFGUI_FOUND)

最后我用以下选项编译了 SFML:

cmake -DCMAKE_CXX_FLAGS="-stdlib=libc++" -DCMAKE_C_COMPILER="/usr/bin/clang" -DCMAKE_CXX_COMPILER="/usr/bin/clang++" -DCMAKE_OSX_ARCHITECTURES="i386;x86_64"

和 SFGUI:

cmake -DCMAKE_CXX_FLAGS="-stdlib=libc++" -DCMAKE_C_COMPILER="/usr/bin/clang" -DCMAKE_CXX_COMPILER="/usr/bin/clang++" -DSFGUI_BUILD_EXAMPLES="false" -DSFGUI_BUILD_DOC="false" -DCMAKE_OSX_ARCHITECTURES="i386;x86_64"

我做错了什么?任何帮助表示赞赏。

【问题讨论】:

  • 看起来您忘记实际链接库.. 但我不是 cmake 专家,所以我无法告诉您原因。最终的链接器命令行是什么样的?
  • 这不会链接SFGUI库吗? target_link_libraries(${PROJECT_NAME} ${SFGUI_LIBRARIES} ${SFGUI_DEPENDENCIES})
  • 看起来很合理。但正如我所说,“不是 cmake 专家”——actual 最终的链接器命令行最终会是什么样子?
  • 抱歉我的无知在这里,但我在哪里可以找到您正在寻找的信息?
  • 观察cmake生成的最终构建命令。如果(例如)它正在生成 Makefile,则在运行 make 时添加 VERBOSE=1,等其他构建系统。您还可以查看 cmake 生成的文件,以在您的构建目录中的某处运行真正的编译器/链接器。

标签: c++ macos cmake sfml


【解决方案1】:

感谢大家的帮助,我想我知道出了什么问题。虽然我不知道为什么会这样......

我变了:

target_link_libraries(${PROJECT_NAME} ${SFGUI_LIBRARIES} ${SFGUI_DEPENDENCIES})

到:

target_link_libraries(${PROJECT_NAME} -lsfgui)

我希望这可以帮助某人。

【讨论】:

  • 这不是您应该使用 CMAKE 的方式。始终寻找库并传递它们。
  • 我同意这是一个糟糕的解决方案,但最终它奏效了。
猜你喜欢
  • 1970-01-01
  • 2013-11-18
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多