在 Ubuntu 20.04 上使用 nana 库时的链接器问题

Linker issue when usiing nana library on Ubuntu 20.04

提问人:Ali Kanat 提问时间:8/17/2021 最后编辑:Ali Kanat 更新时间:3/22/2022 访问量:265

问:

我已经在 Windows 上使用 nana 库一段时间了,效果很好。现在我正在尝试进行 Linux 构建,但我似乎无法将 nana 正确链接到我的应用程序。

我试过这个,但似乎也没有用

我创建了一个小示例来演示该问题。这是我的主要.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) and target_link_libraries(${PROJECT_NAME} -lnana)

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

C++ cmake static-libraries 链接器错误 nana

评论

1赞 Tsyvarev 8/17/2021
“但是,当我将其复制到另一个虚拟机时,它不起作用。” - 可能,另一个虚拟机上的某些库(例如 X11)与您的应用程序编译的库不兼容。“此外,ldd 结果似乎不包含 libnana.so 共享对象。” - 您与(静态库)链接。为什么您希望(共享库)出现在结果中?libnana.alibnana.soldd
0赞 Ali Kanat 8/17/2021
说实话。关于链接的话题,我有点密集。我使用过其他第三方,它们需要共享库,但它们可能是这些静态链接的第三方库的次要依赖项。让我还将共享库复制到 VM,并尝试将LD_LIBRARY_PATH修改为 exe 文件夹。
0赞 Ali Kanat 8/17/2021
@Tsyvarev我将每个库复制到构建文件夹并相应地修改了LD_LIBRARY_PATH,但我仍然收到分段错误。我认为它与 X11 或其他库无关。

答:

3赞 Alex Reinking 8/18/2021 #1

下面是一个实际有效的版本:

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)

nana 开发人员真的非常希望您在构建中包含他们的源代码。最简单的方法是通过 .FetchContent

评论

0赞 Ali Kanat 8/18/2021
我看过这个警告,但我无法从中理解它。它现在可以工作了。非常感谢。几天来,我一直在尝试解决这个问题。