c++ - 在 Ubuntu 20.04 上使用 nano 库时出现链接器问题

标签 c++ cmake static-libraries linker-errors nana

我一直在使用nana library对于我在 Windows 上的应用程序有一段时间,它工作得很好。现在我正在尝试构建 Linux,但我似乎无法将 nana 正确链接到我的应用程序。

我试过了this但它似乎也不起作用

我创建了一个小示例来演示该问题。这是我的 main.cpp

#include <nana/gui/filebox.hpp>
#include <iostream>

int main()
{
    nana::filebox picker{nullptr, true};

    auto paths = picker.show();
    if(paths.empty())
    {
        std::cout<<"Cancelled"<<std::endl;
    }
    else
    {
        for(auto & p : paths)
            std::cout << "Selected file:" << p << std::endl;
    }

}

我的 CMakeList 看起来像这样:

cmake_minimum_required(VERSION 3.0.0)
project(NanaTest VERSION 0.1.0)

include(CTest)
enable_testing()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall")
#set(CMAKE_LINK_WHAT_YOU_USE TRUE)

add_executable(NanaTest main.cpp)

target_include_directories(NanaTest PRIVATE
    usr/local/include/nana)

find_library(NANALIB NAMES libnana.a  REQUIRED PATHS usr/local/lib/)

if(NOT NANALIB)
    message([FATAL_ERROR] "NANALIB not found")
endif()

target_link_libraries(NanaTest ${NANALIB})
#target_link_libraries(${PROJECT_NAME} -lnana)
target_link_libraries(${PROJECT_NAME} -lX11)
target_link_libraries(${PROJECT_NAME} -lXcursor)
target_link_libraries(${PROJECT_NAME} -lpthread )
target_link_libraries(${PROJECT_NAME} -lXft )
target_link_libraries(${PROJECT_NAME} -lfontconfig )

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

这似乎在我运行时起作用。但是,当我将它复制到另一个 VM 时它不起作用。此外,ldd 结果似乎不包含 libnana.so 共享对象。当我在另一个 VM 上运行它时出现段错误,当我使用 gdb 运行它时,这是我得到的错误:

Program received signal SIGSEGV, Segmentation fault.
0x0000555555b80a21 in nana::detail::platform_spec::platform_spec() ()

当我取消注释 set(CMAKE_LINK_WHAT_YOU_USE TRUE) 和 target_link_libraries(${PROJECT_NAME} -lnana)

我可以在 ldd 结果中看到 libnana.so 但是这次当应用程序结束时我得到一个 double free or corruption (!prev) Aborted (core dumped) 错误。有谁知道问题可能是什么。我正在使用 GCC 9.3.0。先感谢您。顺便说一句,我正在使用 nana-hotfix-1.7.4但我试过 1.7.1、1.7.2 和 1.7.3 它们有同样的问题。

最佳答案

这是一个实际有效的构建:

cmake_minimum_required(VERSION 3.21)
project(NanaTest VERSION 0.1.0)

include(FetchContent)
FetchContent_Declare(
  nana
  GIT_REPOSITORY https://github.com/cnjinhao/nana.git
  GIT_TAG        v1.7.4
  GIT_SHALLOW    TRUE
)

FetchContent_MakeAvailable(nana)

add_executable(NanaTest main.cpp)
target_link_libraries(NanaTest PRIVATE nana)

娜娜开发者really, REALLY希望您将他们的资源包含在您的构建中。最简单的方法是通过 FetchContent

关于c++ - 在 Ubuntu 20.04 上使用 nano 库时出现链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68813991/

相关文章:

c++ - DistCC 和 CMake - 在运行 make 时在本地和分布式构建之间进行选择

cmake - 是否可以从 CMake 命令行更改 CMAKE_MODULE_PATH?

xcode4 - Xcode 4 无法从静态库依赖项中找到公共(public)头文件

c++ - 在 Windows 上列出 *.lib 中的函数

c++ - 无法访问 multimap 迭代器的方法?

c++ - 是否有任何好的工具/框架来分析 C/C++ 应用程序的性能

c++ - 使用 Qt,如何使用鼠标移动事件向上或向左调整小部件的大小

c++ - 从外部访问静态成员并通过继承C++

c++ - 使用 2003 年的 c++ 代码是否可行?

iOS 静态库调试符号未包含在 dSYM 中