作为cmake初学者,在windows系统下使用cmake生成c++动态库时出现了下图所示问题,是关于lib文件的。找了一圈,也没发现生成有lib文件。
在google上查,才发现windows系统下动态库生成lib文件,还需要添加以下命令:
#windows系统动态库生成lib文件命令
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
生成动态库Demo(链接在此)
- 文件目录架构:
——源文件目录
——hello-world.cpp
——CMakeLists.txt
——message
——|——Message.cpp
——|——CMakeLists.txt
——|——include
————|——Message.hpp
库源码文件在message目录,其中新建了文件夹include放置头文件Message.hpp。
库文件的CMakeLists.txt:
# set minimum cmake version
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
# project name and language
project(recipe-03 LANGUAGES CXX)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
#配置编译后的输出路径
# 设定动态链接库的存储路径
SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/../bin)
# generate a library from sources
add_library(message
SHARED
Message.cpp
)
target_include_directories(message PUBLIC ./include)
Message库源代码:
Message.hpp
#pragma once
#include <iosfwd>
#include <string>
class Message {
public:
Message(const std::string &m) : message_(m) {}
friend std::ostream &operator<<(std::ostream &os, Message &obj) {
return obj.printObject(os);
}
private:
std::string message_;
std::ostream &printObject(std::ostream &os);
};
Message.cpp
#include "Message.hpp"
#include <iostream>
#include <string>
std::ostream &Message::printObject(std::ostream &os) {
os << "This is my very nice message: " << std::endl;
os << message_;
return os;
}
主CMakeLists.txt
# set minimum cmake version
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
# project name and language
project(recipe-03 LANGUAGES CXX)
# generate a library from sources
add_subdirectory(./message)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_LIST_DIR}/Bin/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_LIST_DIR}/Bin/Release)
set(CMAKE_ARCHIEVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_LIST_DIR}/Bin/Debug)
set(CMAKE_ARCHIEVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_LIST_DIR}/Bin/Release)
message("------------------>add_subdirectory() fininshed!")
message("------------------>CMAKE_ARCHIVE_OUTPUT_DIRECTORY:${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
message("------------------>CMAKE_LIBRARY_OUTPUT_DIRECTORY:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
message("------------------>CMAKE_RUNTIME_OUTPUT_DIRECTORY :${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
add_executable(hello-world hello-world.cpp)
target_link_libraries(hello-world message)
main.cpp
#include "Message.hpp"
#include <iostream>
#include <string>
std::ostream &Message::printObject(std::ostream &os) {
os << "This is my very nice message: " << std::endl;
os << message_;
return os;
}
cmd命令进入到主MakeLists.txt所在目录后(需要提前下载Cmake及MinGW-w64,并将其bin路径添加到系统环境变量Path中):
cmake .
cmake --build .
最后在bin/debug会生成动态库的lib、dll文件,以及exe可执行文件。
别走~下面有提高生产力的方法↓
cmd下的cmake命令批处理
在学习cmake的过程中,也不知道要在cmd中敲入多少遍cmake … cmake --build .,过来人都懂~
有没有什么可以提高生产力的方法,可以让运行程序一样执行一系列的cmd命令呢?这时候就到脚本文件发挥作用的时候了,windows系统下的.bat(对应的,Linux下的是.sh文件)相当于执行cmd命令。只要创建一个txt,然后将cmd命令按行写入其中,最后将后缀名改为bat,使用时双击该.bat文件即可,是不是比当个键盘侠要省力得多。上面demo链接仓库里有写好的bat文件,直接用即可,爽歪歪~
举个栗子:
pushd %~dp0
#判断文件夹build是否存在,不存在则就创建
if not exist build (
mkdir build
) else (
del /S /Q /F build
rd /S /Q build
mkdir build
)
cd build
cmake ..
cmake --build .
#等待回车后退出
TIMEOUT /T -1
作为cmake初学者,在windows系统下使用cmake生成c++动态库时出现了下图所示问题,是关于lib文件的。找了一圈,也没发现生成有lib文件。
在google上查,才发现windows系统下动态库生成lib文件,还需要添加以下命令:
#windows系统动态库生成lib文件命令
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
生成动态库Demo(链接在此)
- 文件目录架构:
——源文件目录
——hello-world.cpp
——CMakeLists.txt
——message
——|——Message.cpp
——|——CMakeLists.txt
——|——include
————|——Message.hpp
库源码文件在message目录,其中新建了文件夹include放置头文件Message.hpp。
库文件的CMakeLists.txt:
# set minimum cmake version
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
# project name and language
project(recipe-03 LANGUAGES CXX)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
#配置编译后的输出路径
# 设定动态链接库的存储路径
SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/../bin)
# generate a library from sources
add_library(message
SHARED
Message.cpp
)
target_include_directories(message PUBLIC ./include)
Message库源代码:
Message.hpp
#pragma once
#include <iosfwd>
#include <string>
class Message {
public:
Message(const std::string &m) : message_(m) {}
friend std::ostream &operator<<(std::ostream &os, Message &obj) {
return obj.printObject(os);
}
private:
std::string message_;
std::ostream &printObject(std::ostream &os);
};
Message.cpp
#include "Message.hpp"
#include <iostream>
#include <string>
std::ostream &Message::printObject(std::ostream &os) {
os << "This is my very nice message: " << std::endl;
os << message_;
return os;
}
主CMakeLists.txt
# set minimum cmake version
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
# project name and language
project(recipe-03 LANGUAGES CXX)
# generate a library from sources
add_subdirectory(./message)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_LIST_DIR}/Bin/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_LIST_DIR}/Bin/Release)
set(CMAKE_ARCHIEVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_LIST_DIR}/Bin/Debug)
set(CMAKE_ARCHIEVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_LIST_DIR}/Bin/Release)
message("------------------>add_subdirectory() fininshed!")
message("------------------>CMAKE_ARCHIVE_OUTPUT_DIRECTORY:${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}")
message("------------------>CMAKE_LIBRARY_OUTPUT_DIRECTORY:${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
message("------------------>CMAKE_RUNTIME_OUTPUT_DIRECTORY :${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
add_executable(hello-world hello-world.cpp)
target_link_libraries(hello-world message)
main.cpp
#include "Message.hpp"
#include <iostream>
#include <string>
std::ostream &Message::printObject(std::ostream &os) {
os << "This is my very nice message: " << std::endl;
os << message_;
return os;
}
cmd命令进入到主MakeLists.txt所在目录后(需要提前下载Cmake及MinGW-w64,并将其bin路径添加到系统环境变量Path中):
cmake .
cmake --build .
最后在bin/debug会生成动态库的lib、dll文件,以及exe可执行文件。
别走~下面有提高生产力的方法↓
cmd下的cmake命令批处理
在学习cmake的过程中,也不知道要在cmd中敲入多少遍cmake … cmake --build .,过来人都懂~
有没有什么可以提高生产力的方法,可以让运行程序一样执行一系列的cmd命令呢?这时候就到脚本文件发挥作用的时候了,windows系统下的.bat(对应的,Linux下的是.sh文件)相当于执行cmd命令。只要创建一个txt,然后将cmd命令按行写入其中,最后将后缀名改为bat,使用时双击该.bat文件即可,是不是比当个键盘侠要省力得多。上面demo链接仓库里有写好的bat文件,直接用即可,爽歪歪~
举个栗子:
pushd %~dp0
#判断文件夹build是否存在,不存在则就创建
if not exist build (
mkdir build
) else (
del /S /Q /F build
rd /S /Q build
mkdir build
)
cd build
cmake ..
cmake --build .
#等待回车后退出
TIMEOUT /T -1