【发布时间】:2021-05-22 16:07:20
【问题描述】:
我正在使用 CLion 和 cmake。
我想在cmakelists.txt 中将我的 dll 链接到我的 c++ 项目,但我不知道该怎么做。
我搜索了很多,但没有找到任何解决方案。
- 我已经在 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")
【问题讨论】:
-
find_library只搜索库文件。对于与图书馆的链接,您仍然需要target_link_libraries(SpeedTest ${${PROJECT_NAME}})。那么,究竟是什么不起作用?你有错误信息吗? -
整个问题分为两点:第一如何给我的dll添加引用? 第二如何使用和调用
main.cpp里面的dll函数。谢谢 -
"如何添加对我的 dll 的引用?" - 您是否询问如何与您的图书馆链接?如果是,请查看that question 并给出答案。 (要与 Windows 上的共享库链接,您需要有 import 文件 (
.lib)。“如何在main.cpp中使用和调用 dll 函数” - 只需#include <module.h>并调用头文件中定义的函数。如需帮助#include查找头文件,请使用include_directories或target_include_directories命令指定包含目录。 -
好的,谢谢您的回答。但那是静态链接。我想要在运行时进行动态链接。有可能吗?
-
.lib文件伴随着静态和动态链接。只需谷歌即可了解导入文件对 dll 的意义。
标签: c++ visual-studio c++11 dll cmake