简体   繁体   中英

I tried use cmake to make project, but it called an error ld: library not found for -levmc::loader

I git clone a project called evmc in github.

I try to build the example folder in this project by cmake. But here are some errors called:

With cmake.

-- Configuring done
CMake Error at CMakeLists.txt:23 (add_executable):
  Target "evmc-example" links to target "evmc::evmc_cpp" but the target was
  not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?


CMake Error at CMakeLists.txt:23 (add_executable):
  Target "evmc-example" links to target "evmc::loader" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?


CMake Error at CMakeLists.txt:19 (add_executable):
  Target "evmc-example-static" links to target "evmc::evmc_cpp" but the
  target was not found.  Perhaps a find_package() call is missing for an
  IMPORTED target, or an ALIAS target is missing?


CMake Error at CMakeLists.txt:19 (add_executable):
  Target "evmc-example-static" links to target "evmc::evmc" but the target
  was not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?


CMake Error at CMakeLists.txt:19 (add_executable):
  Target "evmc-example-static" links to target "evmc::evmc" but the target
  was not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?


CMake Error at CMakeLists.txt:16 (add_library):
  Target "evmc-example-host" links to target "evmc::evmc_cpp" but the target
  was not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?


CMake Error at example_vm/CMakeLists.txt:10 (add_library):
  Target "example-vm-static" links to target "evmc::evmc" but the target was
  not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?


CMake Error at example_vm/CMakeLists.txt:5 (add_library):
  Target "example-vm" links to target "evmc::evmc" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?


CMake Error at example_precompiles_vm/CMakeLists.txt:10 (add_library):
  Target "example-precompiles-vm-static" links to target "evmc::evmc" but the
  target was not found.  Perhaps a find_package() call is missing for an
  IMPORTED target, or an ALIAS target is missing?


CMake Error at example_precompiles_vm/CMakeLists.txt:5 (add_library):
  Target "example-precompiles-vm" links to target "evmc::evmc" but the target
  was not found.  Perhaps a find_package() call is missing for an IMPORTED
  target, or an ALIAS target is missing?


-- Generating done
CMake Generate step failed.  Build files cannot be regenerated correctly.
make: *** [cmake_check_build_system] Error 1

With make

Consolidate compiler generated dependencies of target evmc-example-host
[ 14%] Built target evmc-example-host
Consolidate compiler generated dependencies of target evmc-example
[ 21%] Linking CXX executable evmc-example
ld: library not found for -levmc::loader
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [evmc-example] Error 1
make[1]: *** [CMakeFiles/evmc-example.dir/all] Error 2
make: *** [all] Error 2

Here is my CMakeLists:

# EVMC: Ethereum Client-VM Connector API.
# Copyright 2016-2019 The EVMC Authors.
# Licensed under the Apache License, Version 2.0.

cmake_minimum_required(VERSION 3.13)

set (CMAKE_C_COMPILER /usr/bin/clang)
set (CMAKE_CXX_COMPILER /usr/bin/clang++)
set (CMAKE_CXX_STANDARD 17)

include(GNUInstallDirs)

add_subdirectory(example_vm)
add_subdirectory(example_precompiles_vm)

add_library(evmc-example-host STATIC example_host.cpp)
target_link_libraries(evmc-example-host PRIVATE evmc::evmc_cpp)

add_executable(evmc-example-static example.c)
target_link_libraries(evmc-example-static PRIVATE evmc-example-host evmc::example-vm-static evmc::evmc)
target_compile_definitions(evmc-example-static PRIVATE STATICALLY_LINKED_EXAMPLE)

add_executable(evmc-example example.c)
target_link_libraries(evmc-example PRIVATE evmc-example-host evmc::loader)

include_directories(../include)

Here is my project structure:

evmc
├── AUTHORS.md
├── CHANGELOG.md
├── CMakeCache.txt
├── CMakeLists.txt
├── CNAME
├── CPackConfig.cmake
├── CPackSourceConfig.cmake
├── Cargo.lock
├── Cargo.toml
├── Doxyfile
├── LICENSE
├── Makefile
├── README.md
├── appveyor.yml
├── bindings
│   ├── go
│   ├── java
│   └── rust
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── CPackConfig.cmake
│   ├── CPackSourceConfig.cmake
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── evmcConfig.cmake
│   ├── evmcConfigVersion.cmake
│   └── lib
├── circle.yml
├── cmake
│   ├── Config.cmake.in
│   ├── EVMC.cmake
│   ├── Hunter
│   └── cable
├── cmake_install.cmake
├── codecov.yml
├── docs
│   ├── EVMC.md
│   ├── Host_Guide.md
│   ├── VM_Guide.md
│   ├── VM_Tester.md
│   └── custom.dox
├── evmcConfig.cmake
├── evmcConfigVersion.cmake
├── examples
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── CMakeLists.txt
│   ├── Makefile
│   ├── build
│   ├── cmake_install.cmake
│   ├── example-rust-vm
│   ├── example.c
│   ├── example_host.cpp
│   ├── example_host.h
│   ├── example_precompiles_vm
│   ├── example_vm
│   ├── libevmc-example-host.a
│   ├── use_evmc_in_cmake
│   └── use_instructions_in_cmake
├── go.mod
├── include
│   └── evmc
├── lib
│   ├── CMakeFiles
│   ├── CMakeLists.txt
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── hex
│   ├── instructions
│   ├── loader
│   └── mocked_host
├── target
│   ├── CACHEDIR.TAG
│   └── debug
├── test
│   ├── CMakeLists.txt
│   ├── cmake_package
│   ├── compilation
│   ├── examples
│   ├── gomod
│   ├── tools
│   ├── unittests
│   └── vmtester
└── tools
    ├── CMakeLists.txt
    ├── commands
    ├── evmc
    ├── utils
    └── vmtester

I have upgraded any tools I use in this project: clang, cmake...

But it still can't run correctly, what should I do?

This happened to me because the path I used for the library was incorrect, it was not pointing to the directory that contained the CMakeLists.txt.

I was including cpr using FetchContent in my top level CMakeLists.txt and setting FETCHCONTENT_SOURCEDIR_CPR to the level above accidentally. I had the source for cpr inside cpr/cpr-master but had just set it to cpr.

To answer more generally it means that the path to evmc is probably incorrect.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM