编辑:这似乎是一个g ++问题,因为使用clang ++进行编译会输出一个可执行文件。
我编写了一个C ++应用程序,它具有一个main函数,创建一个应用程序窗口,加载一个3D fbx文件并使用opengl绘制它。要创建用于编译的Makefile,我正在使用CMakeLists.txt文件:
sh -C ${custom command}
因此在运行cmake创建的makefile之后,输出不是预期的可执行文件,而是共享对象文件。如果我在其上运行文件命令,这是输出:
cmd /C ${custom command}
执行时
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})
程序按原样执行。
但是当我通过终端执行文件时,它运行得很好,创建窗口并呈现模型。
关于为什么这是共享对象文件的任何解释? 提前谢谢。
修改: 运行时
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
答案 0 :(得分:2)
使用特殊CFLAGS
编译应用程序时可能会发生这种情况,例如-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,
也许您可以使用VERBOSE=1
运行您的制作并查看是否属实?一般来说,file
可能会使用启发式方法来识别文件类型,因此您不应过分依赖它。
至于ld.so的错误,您使用错误的32位动态链接器来运行64位应用程序。改为使用/lib64/ld-linux-x86-64.so.2(正如file
告诉你的那样)。
编辑:另一个选择是您的GCC是使用--enable-default-pie构建的,modern Ubuntu似乎就是这种情况。您可以通过CFLAGS = -no-pie(或-nopie,取决于GCC版本)来禁用此功能,但我不愿意这样做 - PIE&#eded可执行文件通过允许ASLR执行来使您的系统更安全更好的工作。
答案 1 :(得分:0)
我发现根本原因是-shared
中的CMAKE_EXE_LINKER_FLAGS
标志。
当我删除-shared
时,一切正常。