英文:
How do you add CFLAGS to cmake to look for dependencies locally?
问题
I'm trying to install C++ web framework, drogon
, which requires following steps to install.
cd $WORK_PATH
git clone https://github.com/drogonframework/drogon
cd drogon
git submodule update --init
mkdir build
cd build
cmake ..
make && sudo make install
To install locally, I added the following command option:
cmake --install-prefix=$HOME/local
.
However, the make
process ended up like this:
/bin/ld: ../trantor/libtrantor.a(OpenSSLProvider.cc.o): in function `OpenSSLProvider::processHandshake()`:
OpenSSLProvider.cc:(.text._ZN15OpenSSLProvider16processHandshakeEv[_ZN15OpenSSLProvider16processHandshakeEv]+0x504): undefined reference to `SSL_get1_peer_certificate`
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::md5(void const*, unsigned long)`:
openssl.cc:(.text+0x35): undefined reference to `EVP_MD_fetch`
/bin/ld: openssl.cc:(.text+0xa1): undefined reference to `EVP_MD_free`
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::sha1(void const*, unsigned long)`:
openssl.cc:(.text+0xfc): undefined reference to `EVP_MD_fetch`
/bin/ld: openssl.cc:(.text+0x168): undefined reference to `EVP_MD_free`
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::sha256(void const*, unsigned long)`:
openssl.cc:(.text+0x1c0): undefined reference to `EVP_MD_fetch`
/bin/ld: openssl.cc:(.text+0x22c): undefined reference to `EVP_MD_free`
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::sha3(void const*, unsigned long)`:
openssl.cc:(.text+0x284): undefined reference to `EVP_MD_fetch`
/bin/ld: openssl.cc:(.text+0x2f0): undefined reference to `EVP_MD_free`
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::blake2b(void const*, unsigned long)`:
openssl.cc:(.text+0x348): undefined reference to `EVP_MD_fetch`
/bin/ld: openssl.cc:(.text+0x3b4): undefined reference to `EVP_MD_free`
collect2: error: ld returned 1 exit status
make[2]: *** [examples/CMakeFiles/client.dir/build.make:105: examples/client] Error 1
make[1]: *** [CMakeFiles/Makefile2:293: examples/CMakeFiles/client.dir/all] Error 2
That error is because of the older OpenSSL version the system has, according to cmake
output.
Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1f")
So I installed the newest version (https://www.openssl.org/source/) locally ($HOME/.local
) as well.
The OpenSSL
installation was successful, but when I tried the drogon
installation again, I got the same error at the make
step, with the same error message. Even cmake
produced the same output as above for the OpenSSL
path and its version.
My question is, how do you make cmake
look for stuff locally? Like other installation processes, such as ./configure
, you can add CFLAGS="-I/usr/local/include"
option. Is there a similar method for cmake
?
英文:
I'm trying to install C++ web framework, drogon
, which requires following steps to install.
cd $WORK_PATH
git clone https://github.com/drogonframework/drogon
cd drogon
git submodule update --init
mkdir build
cd build
cmake ..
make && sudo make install
To install locally, I added the following command option,
cmake --install-prefix=$HOME/local
.
However, the make
process ended up like this,
/bin/ld: ../trantor/libtrantor.a(OpenSSLProvider.cc.o): in function `OpenSSLProvider::processHandshake()':
OpenSSLProvider.cc:(.text._ZN15OpenSSLProvider16processHandshakeEv[_ZN15OpenSSLProvider16processHandshakeEv]+0x504): undefined reference to `SSL_get1_peer_certificate'
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::md5(void const*, unsigned long)':
openssl.cc:(.text+0x35): undefined reference to `EVP_MD_fetch'
/bin/ld: openssl.cc:(.text+0xa1): undefined reference to `EVP_MD_free'
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::sha1(void const*, unsigned long)':
openssl.cc:(.text+0xfc): undefined reference to `EVP_MD_fetch'
/bin/ld: openssl.cc:(.text+0x168): undefined reference to `EVP_MD_free'
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::sha256(void const*, unsigned long)':
openssl.cc:(.text+0x1c0): undefined reference to `EVP_MD_fetch'
/bin/ld: openssl.cc:(.text+0x22c): undefined reference to `EVP_MD_free'
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::sha3(void const*, unsigned long)':
openssl.cc:(.text+0x284): undefined reference to `EVP_MD_fetch'
/bin/ld: openssl.cc:(.text+0x2f0): undefined reference to `EVP_MD_free'
/bin/ld: ../trantor/libtrantor.a(openssl.cc.o): in function `trantor::utils::blake2b(void const*, unsigned long)':
openssl.cc:(.text+0x348): undefined reference to `EVP_MD_fetch'
/bin/ld: openssl.cc:(.text+0x3b4): undefined reference to `EVP_MD_free'
collect2: error: ld returned 1 exit status
make[2]: *** [examples/CMakeFiles/client.dir/build.make:105: examples/client] Error 1
make[1]: *** [CMakeFiles/Makefile2:293: examples/CMakeFiles/client.dir/all] Error 2
That error is because of the older OpenSSL version the system has, according to cmake
output.
Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1f")
So I installed newest version (https://www.openssl.org/source/) local ($HOEM/.local
) as well.
The OpenSSL
installation was successful but when I tried the drogon
installation again, I got bounced off at the same step make
with same error.
Even cmake
produced the same output as above for the OpenSSL
path and its version.
My question is how do you make cmake
look for stuff locally ?
Like other installation process like ./configure
, you can add CFLAGS="-I/usr/local/include
option.
Is there similar method to cmake
?
答案1
得分: 1
一般情况下,这取决于CMake项目搜索其依赖项的方式。如果项目使用find_package(<Package>)
,在许多情况下,您可以设置一个变量<Package>_ROOT
,指向该包的安装前缀。对于OpenSSL,您需要使用OPENSSL_ROOT_DIR
,如此文档所述此处。
因此,您需要使用以下命令配置项目:
cmake -DOPENSSL_ROOT_DIR=${HOME}/.local ..
在删除构建目录之后。
英文:
In general it depends on how the CMake projects is searching for its dependencies. If the project uses find_package(<Package>)
, in many cases you can set a variable <Package>_ROOT
to point to the installation prefix of the package. In the case of OpenSSL you'll need to use OPENSSL_ROOT_DIR
as documented here.
So you need to configure the project with
cmake -DOPENSSL_ROOT_DIR=${HOME}/.local ..
after deleting the build directory.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论