我开始here但是已经发生了很大变化我认为最好开始一个新问题,特别是因为我认为该问题中的CMake问题已经解决了。
背景
我正在尝试设置一个项目的基本shell,它涉及将C ++ midtier连接到Oracle 12c数据库。
环境
1. MinGW-64(x86_64-4.9.1-release-win32-sjlj-rt_v3-rev2)
2. Windows 7 64位
3. CLion 2016.1.1(所以我使用的是CMake 3.5.1)
4.所有OCCI DLL都在system32中
5. lib和dll都在C:/Users/hurst/libs
的CMakeLists.txt
cmake_minimum_required(VERSION 3.4)
project(Oracle)
#set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_PREFIX_PATH C:/Users/hurst/libs)
find_library(OCCI1 oraociei12)
find_library(OCCI2 oci)
find_library(OCCI3 orannzsbb12)
find_library(OCCI4 oraocci12)
set(SOURCE_FILES
src/main.cpp
include/occi.h)
add_executable(Oracle ${SOURCE_FILES})
target_link_libraries(Oracle ${OCCI1} ${OCCI2} ${OCCI3} ${OCCI4})
代码
#include <occi.h>
using namespace oracle::occi;
int main()
{
Environment *env = Environment::createEnvironment();
Environment::terminateEnvironment(env);
}
错误
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" --build C:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug --target Oracle -- -j 8
[ 50%] Linking CXX executable C:\Users\hurst\ClionProjects\Oracle\output\Debug\Oracle.exe
CMakeFiles\Oracle.dir/objects.a(main.cpp.obj): In function `main':
C:/Users/hurst/ClionProjects/Oracle/src/main.cpp:7: undefined reference to `oracle::occi::Environment::createEnvironment(oracle::occi::Environment::Mode, void*, void* (*)(void*, unsigned long long), void* (*)(void*, void*, unsigned long long), void (*)(void*, void*))'
C:/Users/hurst/ClionProjects/Oracle/src/main.cpp:8: undefined reference to `oracle::occi::Environment::terminateEnvironment(oracle::occi::Environment*)'
collect2.exe: error: ld returned 1 exit status
CMakeFiles\Oracle.dir\build.make:100: recipe for target 'C:/Users/hurst/ClionProjects/Oracle/output/Debug/Oracle.exe' failed
mingw32-make.exe[3]: *** [C:/Users/hurst/ClionProjects/Oracle/output/Debug/Oracle.exe] Error 1
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/Oracle.dir/all' failed
mingw32-make.exe[2]: *** [CMakeFiles/Oracle.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/Oracle.dir/rule] Error 2
mingw32-make.exe: *** [Oracle] Error 2
CMakeFiles\Makefile2:78: recipe for target 'CMakeFiles/Oracle.dir/rule' failed
makefile:117: recipe for target 'Oracle' failed
有什么建议吗?感谢。
修改
这里建议的是详细错误输出:
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" --build C:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug --target Oracle -- -j 8
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" -HC:\Users\hurst\ClionProjects\Oracle -BC:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug --check-build-system CMakeFiles\Makefile.cmake 0
C:/Users/hurst/Downloads/x86_64-4.9.1-release-win32-sjlj-rt_v3-rev2/mingw64/bin/mingw32-make.exe -f CMakeFiles\Makefile2 Oracle
mingw32-make.exe[1]: Entering directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" -HC:\Users\hurst\ClionProjects\Oracle -BC:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug --check-build-system CMakeFiles\Makefile.cmake 0
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" -E cmake_progress_start C:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug\CMakeFiles 2
C:/Users/hurst/Downloads/x86_64-4.9.1-release-win32-sjlj-rt_v3-rev2/mingw64/bin/mingw32-make.exe -f CMakeFiles\Makefile2 CMakeFiles/Oracle.dir/all
mingw32-make.exe[2]: Entering directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
C:/Users/hurst/Downloads/x86_64-4.9.1-release-win32-sjlj-rt_v3-rev2/mingw64/bin/mingw32-make.exe -f CMakeFiles\Oracle.dir\build.make CMakeFiles/Oracle.dir/depend
mingw32-make.exe[3]: Entering directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" -E cmake_depends "MinGW Makefiles" C:\Users\hurst\ClionProjects\Oracle C:\Users\hurst\ClionProjects\Oracle C:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug C:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug C:\Users\hurst\.CLion2016.1\system\cmake\generated\Oracle-6ad0652d\6ad0652d\Debug\CMakeFiles\Oracle.dir\DependInfo.cmake --color=
mingw32-make.exe[3]: Leaving directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
C:/Users/hurst/Downloads/x86_64-4.9.1-release-win32-sjlj-rt_v3-rev2/mingw64/bin/mingw32-make.exe -f CMakeFiles\Oracle.dir\build.make CMakeFiles/Oracle.dir/build
mingw32-make.exe[3]: Entering directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
[ 50%] Linking CXX executable C:\Users\hurst\ClionProjects\Oracle\output\Debug\Oracle.exe
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" -E cmake_link_script CMakeFiles\Oracle.dir\link.txt --verbose=1
"C:\Program Files (x86)\JetBrains\CLion 2016.1\bin\cmake\bin\cmake.exe" -E remove -f CMakeFiles\Oracle.dir/objects.a
C:\Users\hurst\Downloads\x86_64-4.9.1-release-win32-sjlj-rt_v3-rev2\mingw64\bin\ar.exe cr CMakeFiles\Oracle.dir/objects.a @CMakeFiles\Oracle.dir\objects1.rsp
C:\Users\hurst\Downloads\x86_64-4.9.1-release-win32-sjlj-rt_v3-rev2\mingw64\bin\g++.exe -std=c++11 -g -Wl,--whole-archive CMakeFiles\Oracle.dir/objects.a -Wl,--no-whole-archive -o C:\Users\hurst\ClionProjects\Oracle\output\Debug\Oracle.exe -Wl,--out-implib,C:\Users\hurst\ClionProjects\Oracle\output\Debug\libOracle.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\Oracle.dir\linklibs.rsp
CMakeFiles\Oracle.dir/objects.a(main.cpp.obj): In function `main':
C:/Users/hurst/ClionProjects/Oracle/src/main.cpp:7: undefined reference to `oracle::occi::Environment::createEnvironment(oracle::occi::Environment::Mode, void*, void* (*)(void*, unsigned long long), void* (*)(void*, void*, unsigned long long), void (*)(void*, void*))'
C:/Users/hurst/ClionProjects/Oracle/src/main.cpp:8: undefined reference to `oracle::occi::Environment::terminateEnvironment(oracle::occi::Environment*)'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[3]: *** [C:/Users/hurst/ClionProjects/Oracle/output/Debug/Oracle.exe] Error 1
mingw32-make.exe[2]: *** [CMakeFiles/Oracle.dir/all] Error 2
CMakeFiles\Oracle.dir\build.make:103: recipe for target 'C:/Users/hurst/ClionProjects/Oracle/output/Debug/Oracle.exe' failed
mingw32-make.exe[3]: Leaving directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
CMakeFiles\Makefile2:69: recipe for target 'CMakeFiles/Oracle.dir/all' failed
mingw32-make.exe[2]: Leaving directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
CMakeFiles\Makefile2:81: recipe for target 'CMakeFiles/Oracle.dir/rule' failed
mingw32-make.exe[1]: Leaving directory 'C:/Users/hurst/.CLion2016.1/system/cmake/generated/Oracle-6ad0652d/6ad0652d/Debug'
makefile:120: recipe for target 'Oracle' failed
mingw32-make.exe[1]: *** [CMakeFiles/Oracle.dir/rule] Error 2
mingw32-make.exe: *** [Oracle] Error 2
修改
基于我在another SO answer上所做的一些阅读,我打破了target_link_libraries()调用,这样每次调用就是一个库:
target_link_libraries(Oracle $ {OCCI1})
target_link_libraries(Oracle $ {OCCI2})
target_link_libraries(Oracle $ {OCCI3})
target_link_libraries(Oracle $ {OCCI4})
然后我尝试通过向上/向下移动$ {OCCI2}来运行它,看看它是否成功(即1234,2134,1324,1342),因为$ {OCCI2}是OCI lib,代表了基本的C API, Oracle界面。它不起作用,同样的错误。