我有一个外部项目和一个导入的共享库.include目录和implib都可正常工作,但尝试安装共享库(dll)失败,并出现以下错误:
install TARGETS given target "my_shared_lib" which does not exist in this directory.
Run Code Online (Sandbox Code Playgroud)
这是重现的代码:
add_library(my_shared_lib SHARED IMPORTED GLOBAL)
set_property(TARGET my_shared_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib")
set_property(TARGET my_shared_lib PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.dll")
set_property(TARGET my_shared_lib PROPERTY IMPORTED_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/ExternalProjects/my_shared_lib/my_shared_lib.lib")
add_executable(main main.cpp)
add_dependencies(main my_shared_lib)
target_link_libraries(main PUBLIC my_shared_lib)
install(TARGETS main DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST")
install(TARGETS my_shared_lib DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/DIST")
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:现在我通过使用get_property拉出IMPORTED_LOCATION,然后使用INSTALL FILES并给出该属性的值来解决这个问题.它似乎有效,但是有更好的,更惯用的解决方案吗?
我有时会得到一个过程,如果我跑taskkill /im the_process.exe /f /t,那么它不会杀死它,因为:
ERROR: The process with PID 6492 (child process of PID 5788) could not be terminated.
Reason: There is no running instance of the task.
但是如果我打开任务管理器并单击结束进程,它就会消失.为什么任务管理器工作但是taskkill不行?我需要能够以编程方式终止进程,因此我需要找到一个能够成功终止此进程的CLI命令.
我已经google了一下,但我还没有找到合适的解决方案.
与我之前的问题相关:编译器是否不允许假设const-ref参数将保持const?
我的新问题是:是否有特定于编译器的非标准扩展或语法告诉GCC/Clang/MSVC对象不可写?例如,这里有一些我想写的假代码:
void f(const int& i) {
// At this point, compiler doesn't know if "i" can be mutated or not,
// so it assumes it can
// Fake-ish -- compiler now assumes "i" cannot be mutated and optimizes accordingly
__assume(readonly i);
// ...
}
Run Code Online (Sandbox Code Playgroud) 例如:
void f(const int&);
void g1() {
const int i = 42;
if (i == 42) f(i);
if (i == 42) f(i);
}
void g2() {
int i = 42;
if (i == 42) f(i);
if (i == 42) f(i);
}
Run Code Online (Sandbox Code Playgroud)
似乎"f"变异其参数应该是UB,因此应该允许编译器假设它不会发生并相应地进行优化.然而这两个功能将产生不同的组装.
我没有标准的副本.这不保证吗?
我想从例如test_runner.cpp创建一个可执行文件:
add_executable(myexe ${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp)
Run Code Online (Sandbox Code Playgroud)
但是这个特定的cpp文件本身是在预构建命令中自动生成的:
add_custom_command(
TARGET myexe PRE_BUILD
COMMAND deps/cxxtest-4.4/bin/cxxtestgen --error-printer -o "${CMAKE_CURRENT_BINARY_DIR}/test_runner.cpp" src/My_test_suite.h
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
Run Code Online (Sandbox Code Playgroud)
但现在我无法生成新的cmake构建文件,因为它抱怨缺少的源,这在预构建之前确实缺失.
我记得这个技巧在过去的某个时间有效,但现在似乎没有奏效.
把#pragma warning(push, 0)周围的#include语句实际上并没有阻止/Wall警告,从这些文件中包含的生成.
改变/Wall以/W4解决问题,但使用/Wall似乎被打破.
#pragma warning(push, 0)
#include <iostream>
#pragma warning(pop)
int main() {
std::cout << "Hello, World!";
}
Run Code Online (Sandbox Code Playgroud)
构建输出:
Microsoft Visual Studio社区2017版本15.5.3
完整的命令行开关(从cmake生成):
/GS /TP /analyze- /Wall /Zc:wchar_t /Gm- /O2 /Ob2 /Fd"main.dir\Release\vc141.pdb" /Zc:inline /fp:precise /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "CMAKE_INTDIR=\"Release\"" /D "_MBCS" /errorReport:prompt /WX /Zc:forScope /GR /Gd /Oy- /MD /std:c++14 /Fa"Release/" /EHsc /nologo /Fo"main.dir\Release\" /Fp"main.dir\Release\main.pch" /diagnostics:classic
Run Code Online (Sandbox Code Playgroud)
我google了一下,发现了一个似乎描述同一问题的帖子,但没有提出任何解决方案.希望StackOverflow上的人们有更好的主意吗?
路径前缀的 Gatsby 文档显示我可以定义类似的东西pathPrefix: "/blog",并且确实我尝试过它并且它起作用了。但是,我宁愿不对应用程序所在的路径进行硬编码。我希望能够将构建部署到多个路径,并让它在所有路径中都能正常工作。我希望有一种方法可以使构建从任何任意路径工作。在那儿?
下面的代码没有做任何有趣的事情,但神秘的是为什么Memory博士会认为有一个单一化的阅读?有任何想法吗?
#include <memory>
int main(int argc, const char* argv[])
{
int aa[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::unique_ptr<int[]> p {new int[10]};
for (auto i = 0; i < 10; ++i) {
p[i] = aa[i];
}
return 0;
} // <-- Dr Memory says UNINITIALIZED READ here
Run Code Online (Sandbox Code Playgroud)
编辑:这是完整的错误详细信息.
Error #1: UNINITIALIZED READ: reading 0x0028ff20-0x0028ff24 4 byte(s)
# 0 __mingw_glob [src/main.cpp:14]
# 1 _setargv [src/main.cpp:14]
# 2 __mingw_CRTStartup
# 3 mainCRTStartup
# 4 ntdll.dll!RtlInitializeExceptionChain +0x62 (0x772c8fe2 …Run Code Online (Sandbox Code Playgroud) 我最近一直在玩Compiler Explorer.我加载了一个带有指针参数的示例,并将其更改为取而代之的是unique_ptr参数.但是我注意到在输出程序集中,对操作符删除的调用显然不存在.我很好奇,如果有人知道为什么.
这是一个可以粘贴到资源管理器中的示例.一定要-O3加入编译器选项.
#include <memory>
using std::unique_ptr;
void maxArray(unique_ptr<double[]> x, unique_ptr<double[]> y) {
for (int i = 0; i < 65536; i++) {
if (y[i] > x[i]) x[i] = y[i];
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:另外作比较,如果不是我在从cppreference示例代码粘贴一个,然后我就得到运营商在输出中删除.
#include <iostream>
#include <memory>
struct Foo
{
Foo() { std::cout << "Foo::Foo\n"; }
~Foo() { std::cout << "Foo::~Foo\n"; }
void bar() { std::cout << "Foo::bar\n"; }
};
void f(const Foo &)
{
std::cout << "f(const Foo&)\n";
}
int main()
{
std::unique_ptr<Foo> …Run Code Online (Sandbox Code Playgroud) 如果某个布尔条件为真(例如ENABLE_TESTING),那么我想运行如下:
COMMAND ./b2 --with-filesystem --with-program_options --with-test
Run Code Online (Sandbox Code Playgroud)
如果布尔条件为假,那么我想要:
COMMAND ""
Run Code Online (Sandbox Code Playgroud)
看起来我可以通过这个非常丑陋的代码实现这一点:
COMMAND $<$<BOOL:${ENABLE_TESTING}>:./b2> $<$<BOOL:${ENABLE_TESTING}>:--with-filesystem> $<$<BOOL:${ENABLE_TESTING}>:--with-program_options> $<$<BOOL:${ENABLE_TESTING}>:--with-test>
Run Code Online (Sandbox Code Playgroud)
但正如你所看到的,我必须一遍又一遍地重复布尔测试.如果我天真地尝试将它们组合成一个表达式:
COMMAND $<$<BOOL:${ENABLE_TESTING}>:./b2 --with-filesystem --with-program_options --with-test>
Run Code Online (Sandbox Code Playgroud)
然后我得到了错误/bin/sh: 1: $<1:./b2: not found.显然,在计算生成器表达式之前,会解析这些空格.所以我引用了整个事情:
COMMAND "$<$<BOOL:${ENABLE_TESTING}>:./b2 --with-filesystem --with-program_options --with-test>"
Run Code Online (Sandbox Code Playgroud)
但这会产生错误/bin/sh 1: /b2 --with-filesystem --with-program_options --with-test: not found.我想它将整个事物视为命令的名称而不是带有选项的命令.我怎样才能以干净利落的方式写出来呢?
编辑:我试图简化代码的最小例子,但我遗漏了一个额外的复杂性.这个命令发生在一个ExternalProject_Add部分,我需要依赖特殊的令牌,如<BINARY_DIR>.
COMMAND ./b2 "--stagedir=<BINARY_DIR>" --with-filesystem --with-program_options --with-test
Run Code Online (Sandbox Code Playgroud)
我无法将命令移动到其他地方的if语句中,因为如果我这样做,那么目录标记不会被扩展.
我在将Selenium与影子DOM内的元素一起使用时遇到问题。有这个窍门吗?难道我做错了什么?
这是我的各种尝试:
var webdriver = require('selenium-webdriver');
var driver = new webdriver.Builder().forBrowser('chrome').build();
driver.get('https://shop.polymer-project.org/');
// Goal is to find shop-app #shadow-root app-header
//
// This is OK; no shadow DOMs
driver.findElement(webdriver.By.css('shop-app'));
// This fails because:
// NoSuchElementError: no such element: Unable to locate element
driver.findElement(webdriver.By.css('shop-app /deep/ app-header'));
// This fails because:
// NoSuchElementError: no such element: Unable to locate element
driver.findElement(webdriver.By.css('shop-app::shadow app-header'));
// This fails because:
// TypeError: Custom locator did not return a WebElement
driver.findElement(webdriver.By.js(function() {
return document.querySelector('shop-app /deep/ app-header');
})); …Run Code Online (Sandbox Code Playgroud) 我正在做的一个项目和一些MSDN 文档有这样的代码:
IFileOpenDialog *pFileOpen;
IID_PPV_ARGS(&pFileOpen)
Run Code Online (Sandbox Code Playgroud)
其中 IID_PPV_ARGS 是:
#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)
Run Code Online (Sandbox Code Playgroud)
我的问题是关于**(ppType)部分的。这不会最终取消引用空指针或未初始化的指针吗?为什么这样做?
我有一个 cmake 项目,它依赖于另一个库。另一个库也使用 cmake,但其构建步骤似乎更像是一个独立的项目而不是一个库。因此,当我的 cmake 尝试访问add_subdirectory()cmake 库时,我会收到诸如“CPack.cmake 已包含在内!!”之类的错误。和“找不到 CPack 自述资源文件。” 所以,除非有一些聪明的技巧,否则我假设 add_subdirectory() 在这里不是一个现实的选择?将图书馆的建设集成到我的项目的建设中的最佳替代方案是什么?
我想到的几个想法是:
使用自定义命令动态生成库的 cmake 构建文件,然后使用更多自定义命令来启动构建。
只需手动构建库并将预构建的二进制文件与我的项目一起存储以用于各种操作系统/架构/编译器组合。
想法?