c++ - 将我的动态链接库链接到我的 CPP 可执行文件
问题描述
我将 CLion 与 cmake 一起使用。
我想将我的 dll 链接到我的 c++ 项目,cmakelists.txt
但我不知道该怎么做。
我已经搜索了很多,但我没有找到任何解决方案。
- 我已经在 c++ 中通过 Visual Studio 发布了一个 dll,我想将它链接到我的 cmake 项目。
- 项目名称和输出名称是
Benchmark
->Benchmark.dll
- 项目名称和输出名称是
这是代码:module.hpp
#pragma once
#ifdef CFAMILY_EXPORTS
#define CFAMILY_API __declspec(dllexport)
#else
#define CFAMILY_API __declspec(dllimport)
#endif
typedef std::chrono::steady_clock::time_point tpoint;
typedef std::chrono::seconds secs;
typedef std::chrono::milliseconds millis;
typedef std::chrono::microseconds micros;
typedef std::chrono::nanoseconds nanos;
using std::chrono::duration_cast;
const auto tnow = std::chrono::high_resolution_clock::now;
extern "C" {
CFAMILY_API void ResetTimer();
CFAMILY_API void StartTimer();
CFAMILY_API void FinishTimer();
CFAMILY_API long long GetTimer();
CFAMILY_API long long GetTimerMillis();
CFAMILY_API long long GetTimerMicros();
CFAMILY_API long long GetTimerNanos();
}
module.cpp
#include "pch.h"
#include "module.hpp"
static auto start_time = tpoint();
static auto end_time = tpoint();
void ResetTimer()
{
start_time = tpoint();
end_time = tpoint();
}
void StartTimer() { start_time = tnow(); }
void FinishTimer() { end_time = tnow(); }
long long GetTimer() { return duration_cast<secs>(end_time - start_time).count(); }
long long GetTimerMillis() { return duration_cast<millis>(end_time - start_time).count(); }
long long GetTimerMicros() { return duration_cast<micros>(end_time - start_time).count(); }
long long GetTimerNanos() { return duration_cast<nanos>(end_time - start_time).count(); }
- 然后在我的 clion 项目中我想使用它:
main.cpp
#include <iostream>
// include my benchmark.dll here and use its methods
int main() {
// StartTimer(); in dll
for (int i = 0; i < 1000000; i++) continue;
// FinishTimer(); in dll
// cout << GetTimerNanos() << endl;
return 0;
}
cmakelists.txt
cmake_minimum_required(VERSION 3.17)
project(SpeedTest)
set(CMAKE_CXX_STANDARD 20)
add_executable(SpeedTest main.cpp)
find_library(${PROJECT_NAME}
NAMES Benchmark
HINTS "D:\\VS Projects\\BenchmarkLibrary\\C-Family\\Release-output\\x64")
解决方案
如果是绝对目录,.dll
则只"D:\\VS Projects\\BenchmarkLibrary\\C-Family\\Release-output\\x64"
需要添加以下find_library
语句即可。正如评论所说,它只是搜索图书馆。
target_link_directories(SpeedTest
PRIVATE
"D:\\VS Projects\\BenchmarkLibrary\\C-Family\\Release-output\\x64"
)
target_link_libraries(SpeedTest PRIVATE Benchmark)
更新:
要调用函数,请使用与您的库关联的标头。使用绝对目录包含它或编辑您的CMakeLists.txt
文件以添加该目录,然后使用标题的名称,即在您的module.hpp
,使用#include"someHeader.hpp"
,然后您可以使用中声明的函数someHeader.hpp
要包含标题的目录,请修改您CMakeLists.txt
以添加
target_include_directories(SpeedTest PRIVATE "The dir. of the header")
推荐阅读
- google-cloud-platform - G++ 未检测到 Google Cloud 功能
- python - 如何根据条件将数据框列中的值写入另一列?
- python - Flask-Admin Bootstrap 4 X-editable date 导致错误
- javascript - 在 React w/Redux 中映射后如何访问对象的道具?
- inheritance - Solidity 合约可以同时继承基类和接口吗?
- ansible - Ansible 任务条件总是错误地引用 dict 成员
- ios - 使用 SwiftUI 将 JSON 解析为 HStack
- spring - 无法通过数据库将数据获取到碧玉报告中
- powershell - Powershell - 重命名文件
- flutter - Flutter path_provider 获取 _CastError