“make”的输出是共享对象而不是可执行文件

2023-12-04

编辑:这似乎是一个 g++ 问题,因为使用 clang++ 编译确实输出一个可执行文件。

我编写了一个 C++ 应用程序,它具有主函数、创建应用程序窗口、加载 3D fbx 文件并使用 opengl 绘制该文件。要创建用于编译的 Makefile,我使用 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 2.8)
project(solight)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
INCLUDE_DIRECTORIES(lib/include)

###########################################
#SET THIS TO X32 IN CASE OF A 32 BIT SYSTEM
###########################################
set (ARCH x64)

set (SRC_LIST
    src/assetmanager.cpp src/assetmanager.h
    src/mesh.cpp src/mesh.h
    src/model.cpp src/model.h
    src/modelloader.h
    src/main.cpp
    src/math.h
    src/fbxmodelloader.cpp src/fbxmodelloader.h
    src/rendermodule.h
    src/openglrendermodule.cpp src/openglrendermodule.h
    src/textureloader.h
    src/engine.cpp src/enginemodules.cpp src/engine.h
)


##########################
#EXTERNAL LIBRARY HANDLING
##########################

set (LINUX_DEPS
    libfbxsdk.a
    pthread
    libSDL2.a
    GL
    libGLEW.a
    dl
)

set (WIN32_DEPS
)

set (APPLE_DEPS
)

if (UNIX AND NOT APPLE)
    set (DEPS ${LINUX_DEPS})
    set (OS Linux)
endif()

if (APPLE)
    set (DEPS ${APPLE_DEPS})
    set (OS Apple)
endif()

if (WIN32)
    set (DEPS ${WIN32_DEPS})
    set (OS WIN32)
endif()


LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/lib/${OS}/${ARCH})

####################
#EXECUTBALE CREATION
####################

add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} ${DEPS})

因此,运行 cmake 创建的 makefile 后,输出不是预期的可执行文件,而是共享对象文件。如果我在其上运行文件命令,这就是输出:

solight: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=f20c07c8743a70bca20d4a0d9f50fcb108b8140e, not stripped

执行时

 /lib64/ld-linux-x86-64.so.2 ./solight --verify

程序按其应有的方式执行。

But当我通过终端执行文件时,它运行得很好,创建窗口并渲染模型。

解释一下为什么这是一个共享对象文件? 提前致谢。

Edit:跑步时

make VERBOSE=1

输出是:

    /usr/bin/cmake -H/home/wouter/Documents/Solight -B/home/wouter/Documents/Solight/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/wouter/Documents/Solight/build/CMakeFiles /home/wouter/Documents/Solight/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/wouter/Documents/Solight/build'
make -f CMakeFiles/solight.dir/build.make CMakeFiles/solight.dir/depend
make[2]: Entering directory '/home/wouter/Documents/Solight/build'
cd /home/wouter/Documents/Solight/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/wouter/Documents/Solight /home/wouter/Documents/Solight /home/wouter/Documents/Solight/build /home/wouter/Documents/Solight/build /home/wouter/Documents/Solight/build/CMakeFiles/solight.dir/DependInfo.cmake --color=
Dependee "/home/wouter/Documents/Solight/build/CMakeFiles/solight.dir/DependInfo.cmake" is newer than depender "/home/wouter/Documents/Solight/build/CMakeFiles/solight.dir/depend.internal".
Dependee "/home/wouter/Documents/Solight/build/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/wouter/Documents/Solight/build/CMakeFiles/solight.dir/depend.internal".
Scanning dependencies of target solight
make[2]: Leaving directory '/home/wouter/Documents/Solight/build'
make -f CMakeFiles/solight.dir/build.make CMakeFiles/solight.dir/build
make[2]: Entering directory '/home/wouter/Documents/Solight/build'
[ 11%] Building CXX object CMakeFiles/solight.dir/src/assetmanager.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/assetmanager.cpp.o -c /home/wouter/Documents/Solight/src/assetmanager.cpp
[ 22%] Building CXX object CMakeFiles/solight.dir/src/mesh.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/mesh.cpp.o -c /home/wouter/Documents/Solight/src/mesh.cpp
[ 33%] Building CXX object CMakeFiles/solight.dir/src/model.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/model.cpp.o -c /home/wouter/Documents/Solight/src/model.cpp
[ 44%] Building CXX object CMakeFiles/solight.dir/src/main.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/main.cpp.o -c /home/wouter/Documents/Solight/src/main.cpp
[ 55%] Building CXX object CMakeFiles/solight.dir/src/fbxmodelloader.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/fbxmodelloader.cpp.o -c /home/wouter/Documents/Solight/src/fbxmodelloader.cpp
[ 66%] Building CXX object CMakeFiles/solight.dir/src/openglrendermodule.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/openglrendermodule.cpp.o -c /home/wouter/Documents/Solight/src/openglrendermodule.cpp
[ 77%] Building CXX object CMakeFiles/solight.dir/src/engine.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/engine.cpp.o -c /home/wouter/Documents/Solight/src/engine.cpp
[ 88%] Building CXX object CMakeFiles/solight.dir/src/enginemodules.cpp.o
/usr/bin/c++    -I/home/wouter/Documents/Solight/lib/include  -std=c++14   -o CMakeFiles/solight.dir/src/enginemodules.cpp.o -c /home/wouter/Documents/Solight/src/enginemodules.cpp
[100%] Linking CXX executable solight
/usr/bin/cmake -E cmake_link_script CMakeFiles/solight.dir/link.txt --verbose=1
/usr/bin/c++    -std=c++14   CMakeFiles/solight.dir/src/assetmanager.cpp.o CMakeFiles/solight.dir/src/mesh.cpp.o CMakeFiles/solight.dir/src/model.cpp.o CMakeFiles/solight.dir/src/main.cpp.o CMakeFiles/solight.dir/src/fbxmodelloader.cpp.o CMakeFiles/solight.dir/src/openglrendermodule.cpp.o CMakeFiles/solight.dir/src/engine.cpp.o CMakeFiles/solight.dir/src/enginemodules.cpp.o  -o solight  -L/home/wouter/Documents/Solight/lib/Linux/x64 -rdynamic -Wl,-Bstatic -lfbxsdk -Wl,-Bdynamic -lpthread -Wl,-Bstatic -lSDL2 -Wl,-Bdynamic -lGL -Wl,-Bstatic -lGLEW -Wl,-Bdynamic -ldl -Wl,-rpath,/home/wouter/Documents/Solight/lib/Linux/x64 
/home/wouter/Documents/Solight/lib/Linux/x64/libfbxsdk.a(fbxutils.o): In function `fbxsdk_2015_1::FbxPathUtils::GenerateFileName(char const*, char const*)':
(.text+0x4c8): warning: the use of `tempnam' is dangerous, better use `mkstemp'
make[2]: Leaving directory '/home/wouter/Documents/Solight/build'
[100%] Built target solight
make[1]: Leaving directory '/home/wouter/Documents/Solight/build'
/usr/bin/cmake -E cmake_progress_start /home/wouter/Documents/Solight/build/CMakeFiles 0

当应用程序使用特殊编译时可能会发生这种情况CFLAGS e.g. -pie -fPIE:

$ echo 'int main() { return 0; }' | gcc -x c - -fPIE -pie
$ file a.out
a.out: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, 

也许你可以运行你的 makeVERBOSE=1看看是不是这样?一般来说file可能会使用启发式方法来识别文件类型,因此您不应过于依赖它。

至于 ld.so 的错误,您使用了错误的 32 位动态链接器来运行 64 位应用程序。使用 /lib64/ld-linux-x86-64.so.2 代替(如file告诉过你了)。

编辑:另一种选择是你的 GCC 是用--启用默认饼图情况似乎如此现代Ubuntu。您可以通过使用 CFLAGS=-no-pie(或 -nopie,取决于 GCC 版本)进行 cmaking 来禁用此功能,但我不想这样做 - PIE 的可执行文件允许 ASLR 做得更好,从而使您的系统更安全。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“make”的输出是共享对象而不是可执行文件 的相关文章

  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐

  • 将 Underscore 模块与 Node.js 结合使用

    我一直在学习 Node js 和模块 但似乎无法让 Underscore 库正常工作 似乎我第一次使用 Underscore 中的函数时 它会覆盖 对象 结果为我的函数调用 有人知道发生了什么事吗 例如 以下是来自 node js REPL
  • 将函数应用于屏蔽 numpy 数组

    我有一个作为 numpy 数组的图像和一个图像掩码 from scipy misc import face img face gray True mask img gt 250 如何将函数应用于所有屏蔽元素 def foo x return
  • Vuejs - 未定义需求

    我只是在玩弄 vuejs 路由器并尝试加载组件 我使用了示例代码并进行了更改foo Define some components var Foo Vue extend template require components test vue
  • 资产管道、指南针字体和 eot?iefix 对字体的调用

    我正在尝试使用 Compass font face mixin 其中包含 eot iefix 我的应用程序 资产 字体包含所需的所有字体类型 包括 eot 当我尝试运行 asset precompile 时 任务失败 并显示如下内容 web
  • 在您的项目中找不到有效的 GoogleService-Info.plist

    当我使用 Xcode 9 beta 4 运行 swift 3 2 代码时 出现以下错误 Terminating app due to uncaught exception com firebase core reason FIRApp co
  • Android - 广播接收器没有被触发

    我知道这里已经被问了很多 但我已经在互联网上搜索了几个小时 我什至重复使用了以前的一些代码来接收短信 但我什么也没得到 因此 这里是接收短信的基本应用程序 但该应用程序从未收到意图 我认为如果文本是从同一部手机发送的 则意图可能会被忽略 但
  • 尽管为“子视图”赋予了值,但无法将空子视图添加到 ViewGroup

    我的应用程序在启动时立即崩溃 由于某种原因 它声明它是一个 IllegalArgumentException 尽管我不明白为什么 我已经正确实例化了 setContentView 我尝试仅在没有 R id 的情况下将参数设置为 Activi
  • 动态数组的惯用初始化是否会调用未定义的行为?

    这个问题可能有点争议 我在块范围内有以下代码 int a malloc 3 sizeof int if a error handling a 0 0 a 1 1 a 2 2 我认为这段代码调用了UB由于指针算术超出范围 原因是 有效型对象指
  • 单击下一步按钮时无法获取当前页面作为参数

    我试图在以下情况下获取页码作为参数next单击按钮 我正在尝试使用以下代码来实现它 onPaging function pgButton if pgButton next window alert next clicked n page u
  • 在 ASP.NET 中通过 C# 使用 Ajax 进行文件上传

    我需要使用 FileUpload 上传图像而无需回发 使用 Ajax 我尝试了很多示例 但是在所有回发即将到来或他们正在使用 PHP 时 任何人都可以帮助我在 ASP Net 中使用 ajax 进行单文件上传或多文件上传使用 C SWF上传
  • Firebase 函数总是超时完成

    我正在使用 firebase 功能通过云消息传递创建通知 但我总是收到此错误 Function execution took 60006 ms finished with status timeout 但通知有效 这是我在index js中
  • 如何破解包含连字符的长网址

    我正在尝试使用乳胶打破长网址 我有 3 个链接 第一个包含连字符的链接不起作用 但其他两个链接可以工作 因为它们不包含连字符 我像这样使用 url the url to brak hline textbf Documentation Ric
  • 如何从 Jasper Report 调用存储过程?

    如何从 Jasper Report 调用存储过程 The JasperReports Ultimate Guide包含有关使用存储过程的信息 必须满足某些条件才能将存储过程调用放入报告模板的 SQL 查询字符串中 通过 JDBC 调用时 存
  • 为什么 sudo 会改变 PATH? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 这是PATH没有 sudo 的变量 echo echo PATH sh opt local ruby bin usr bin bin 这是PATH带有 sudo 的变量 echo e
  • 如何使 Excel 从 TFS 2010 工作项查询自动刷新

    我们使用 Microsoft 默认提供的 MSF Agile 5 0 流程模板来运行我们的项目 具体来说 迭代待办事项列表 Excel 表格对于进行项目管理非常有用 然而 我们遇到过第 1 个工作表上的迭代待办事项列表不是最新的情况 打开
  • 如何在 SQL Server 中选择舍入数字

    我有一个包含此列的工资表 EMPLOYEE NAME SALARY ANNA 113750 MARRY 124300 BELLA 105100 我想将工资金额四舍五入到附近的 2000 或 5000 小数 所以对于这种情况 它会像 EMPL
  • 升级应用程序时安装到同一路径

    我有一个正在实施自动更新的应用程序 我有一个 Web 服务 程序会检查该服务 如果需要升级 则会下载并运行新的安装程序 Visual Studio 2005 安装项目 然后程序重新启动 一切都很好 但是如何确保安装程序中的安装路径默认与用户
  • 如何子类化 NSDate?

    我第一次尝试对 NSDate 进行子类化 为其提供我需要的 2 个方法 编译正常 但在运行时我尝试访问它时出现错误 可以说我只想要子类中未修改的当前日期 myNSDate date 我收到错误 NSDate initWithTimeInte
  • div 内的 Jquery 复选框一次选中一个

    所以我有一个自动生成的 div 里面有 3 个具有不同 id 和名称的复选框 默认情况下没有一个被选中 如果其中一个碰巧被检查 那么我需要另外两个未被检查 所以一次只能检查一个 所以全部未选中或仅选中一项 div class configo
  • “make”的输出是共享对象而不是可执行文件

    编辑 这似乎是一个 g 问题 因为使用 clang 编译确实输出一个可执行文件 我编写了一个 C 应用程序 它具有主函数 创建应用程序窗口 加载 3D fbx 文件并使用 opengl 绘制该文件 要创建用于编译的 Makefile 我使用