2016-12-23 6 views
2

編集:g ++の問題です.clang ++でコンパイルすると実行ファイルが出力されます。'make'の出力は共有オブジェクトであり、実行可能ファイルではありません。

主な機能を持つC++アプリケーションを作成し、アプリケーションウィンドウを作成し、3D fbxファイルを読み込んで、openglを使用して描画しました。私はCMakeLists.txtファイルを使用しているコンパイルするためのMakefileを作成するには:

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の作成メイクファイルを実行した後に、出力が期待通りに実行が、共有オブジェクトファイルではありません。私はそれにファイルコマンドを実行すると、これは出力されます。

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 

を実行すると、プログラムは、それが必要として実行されます。

しかし、端末でファイルを実行すると、うまく動作し、ウィンドウが作成され、モデルがレンダリングされます。

なぜこれが共有オブジェクトファイルであるかについての説明はありますか? ありがとうございます。

編集:

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 

答えて

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があなたに言ったように)。

EDIT:GCCが--enable-default-pieで構築されていて、これはmodern Ubuntuの場合のようです。この機能を無効にするにはCFLAGS = -no-pie(またはGCCのバージョンに応じて-nopie)を使用しますが、そうしないでください。PIEの実行ファイルは、ASLRがより良い仕事をすることを可能にすることによってシステムをより安全にします。

+0

これが(それでもテストしなければならない)場合、cmakeがそのようなmakefileを生成する理由は何ですか? –

+0

私は冗長出力の結果を待っていましたが、システムコンパイラが何らかの方法で(おそらく[--enable-default-pie](https://gcc.gnu.org/ viewcvs/gcc?view = revision&revision = 223796)?)。 – yugr

+0

質問に出力を追加しましたが、私はそのオプションを一度も使用していない、またはデフォルトとして設定されていますか?どのように私はこれをチェックするだろうか? –

関連する問題