我有一个使用OpenMP的CMake项目,可以在linux上运行。 当我在Windows机器上编译它时,看起来CMake很难findmingw的gcc的openmp标志。
我决定尝试一个更小的testing用例,然后编译main_openmp.c
#include <omp.h> #include <stdio.h> int main(int argc, char* argv[]) { int id; #pragma omp parallel private(id) { id = omp_get_thread_num(); printf("%d: Hello World!\n", id); } return 0; }
然后当我尝试编译
gcc -o OpenMPTest2 main_testomp.c -fopenmp
我明白了
>>> gcc -o OpenMPTest2 main_testomp.c -fopenmp c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: cannot find -lpthread collect2.exe: error: ld returned 1 exit status
我试图在网上find解决scheme,并尝试了-lgomp,-lpthreadgc2和-lpthreadvc2的变体,没有任何改进。
我search我的C:\ MinGw目录recursion的任何包含lpthread的文件名,并得到这个:
C:\MinGW\bin\pthreadgc2.dll C:\MinGW\bin\pthreadgce2.dll C:\MinGW\var\cache\mingw-get\packages\pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma C:\MinGW\var\lib\mingw-get\data\mingw32-pthreads-w32.xml
我不确定我是否错过了一面旗帜,一个包裹,或者我做错了什么。 这里的好办法是输出gcc -v
Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=mingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto --enable-libssp --disable-multilib --ena ble-languages=c,c++,fortran,objc,obj-c++,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32 -registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gm p-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --with-mpfr= --with-sy stem-zlib --with-gnu-as --enable-decimal-float=yes --enable-libgomp --enable-threads --with-libiconv -prefix=/mingw32 --with-libintl-prefix=/mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIM E_T Thread model: win32 gcc version 4.8.1 (GCC)
任何想法有什么不对?
我终于能够使事情工作。
首先,使用mingw-get我安装了mingw32-pthreads-w32
这使我可以在gcc中使用-fopenmp标志。
但是当使用CMake时,我不得不包含这些行:
message(STATUS "Checking OpenMP") find_package(OpenMP) IF(OPENMP_FOUND) message("Found OpenMP! ^_^") # add flags for OpenMP set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OpenMP_SHARED_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") ELSE() message("Missed OpenMP! x_x") ENDIF()
正常,但我也必须确保我的target_link_libraries命令中有OpenMP_CXX_FLAGS
set(SOURCE_FILES src/foo.cpp src/bar.cpp src/baz.cpp) add_library(<mylib> SHARED ${SOURCE_FILES}) target_link_libraries(<mylib> ${OpenMP_CXX_FLAGS})
在您的CMakeLists.txt
文件中,您应该使用以下内容:
find_package(OpenMP REQUIRED) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
如果在配置cmake时出现错误,那就意味着你没有必要的库,或者至少cmake找不到它们。 如果你有库和cmake找不到它们,那么确保查找路径设置为:
set (CMAKE_FIND_ROOT_PATH C:/MinGW)
您可能想要尝试创建一个“工具链”文件,如下所述。
我也建议你尝试mingw-w64来交叉编译Windows。 我成功地将它用于32位和64位应用程序。 我使用mingw [32/64] -cmake,然后一切正常。
我使用Fedora 19和20,和你的问题相关的一些软件包(对于32位):
mingw32-filesystem mingw32-libgomp
非常简单的步骤,为我工作: