在 Ubuntu 20.04 上使用 nano 库时出现链接器问题
Linker issue when usiing nana library on Ubuntu 20.04
我在 Windows 上的应用程序中使用 nana library 有一段时间了,效果很好。现在我正在尝试进行 Linux 构建,但我似乎无法 link 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) and 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)
nana 开发人员 really, REALLY 希望您在构建中包含他们的源代码。最简单的方法是通过 FetchContent
.
我在 Windows 上的应用程序中使用 nana library 有一段时间了,效果很好。现在我正在尝试进行 Linux 构建,但我似乎无法 link 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) and 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)
nana 开发人员 really, REALLY 希望您在构建中包含他们的源代码。最简单的方法是通过 FetchContent
.