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

时间:2016-12-23 14:54:26

标签: c++ opengl cmake shared-libraries executable

编辑:这似乎是一个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

2 个答案:

答案 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时,一切正常。