我发现自己一遍又一遍地违背用 ccmake 配置 cmake 路径的原则,就像 for ex 的每次更改一样。编译器我的一些库路径丢失了。
特别是(未链接的)lapack、lapacke、gsl 的路径要么丢失,要么设置为系统默认值,而不是我用brew 安装的路径。
必须有一种方法告诉 cmake “忽略”系统库,而是查看自制程序路径(例如 /opt/homebrew/lib、/opt/homebrew/include 等)。
我不想链接这些库,因为不建议这样做,而且我在切换环境方面没有经验。
[编辑] MRE:
git clone https://gitlab.physik.uni-muenchen.de/AG-Scrinzi/tRecX.git
cd tRecX
cmake . -DCMAKE_BUILD_TYPE=Parallel
make -j 8
Run Code Online (Sandbox Code Playgroud)
我将以下内容添加到 .bash_profile/.zshrc 中:
export LDFLAGS="-L/opt/homebrew/opt/lapack/lib -L/opt/homebrew/opt/lapack/lib"
export CPPFLAGS="-I/opt/homebrew/opt/lapack/include -I/opt/homebrew/opt/openblas/include"
export PKG_CONFIG_PATH="/opt/homebrew/opt/lapack/lib/pkgconfig /opt/homebrew/opt/openblas/lib/pkgconfig"
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
cmake . -DCMAKE_PREFIX_PATH=/opt/homebrew -DCMAKE_FIND_FRAMEWORK=NEVER -DCMAKE_FIND_APPBUNDLE=NEVER -DCMAKE_FIND_USE_CMAKE_SYSTEM_PATH=FALSE -DCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH=FALSE -DMPI_CXX_COMPILER=/opt/homebrew/bin/mpicxx -DMPI_C_COMPILER=/opt/homebrew/bin/mpicc -DCMAKE_CXX_COMPILER=/opt/homebrew/bin/g++-11 -DCMAKE_C_COMPILER=/opt/homebrew/bin/gcc-11
Run Code Online (Sandbox Code Playgroud) 最近我想出了一个想法,如何枚举参数包(脉冲)中的元素,我对这个解决方案很满意一段时间:
lastValue = 0.0; i = -1;
lastValue += (... + ((time <= endtimes[++i] && time >= delays[i]) ? static_cast<Pulses*>(fields[i])->operator()(time - delays[i]) : 0.0));
Run Code Online (Sandbox Code Playgroud)
但是现在当我尝试使用 Clang 而不是 GCC 进行编译时,我收到了以下警告
警告:对“i”的多次未排序修改 [-Wunsequenced]
我读过几篇关于无序修改的帖子,但在他们的例子中,修改要么在表达式中发生两次,要么发生在“=”运算符的左侧。
另一方面,我的理解是参数包是按顺序评估的,所以......没有未排序的行为,对吗?或者我在这里完全错了,编译器总是对的?