我继承了一个需要移植到Linux的大型C++项目.该项目中有超过200,000行源,分布在300多个文件中.有一个可视依赖/包含树来引用这个项目是非常有帮助的,这样我就可以对应用程序的内部结构有一个总体的感觉.这也可以帮助我找到核心模块和Windows头文件之间的"故障线",以便我可以在以后将它们存根.
Visual Studio中的类查看器根本就没有剪切它.我正在四处阅读,并了解到Doxygen是列出依赖关系的常用工具.我更像是一个视觉人,发现这不是那么有用.幸运的是,我了解了Graphviz插件,使用了一个名为"Dot"的东西,它使我能够为部件生成依赖树.不幸的是,为特定文件生成了数百个较小的依赖树,而不是像我希望的那样拥有一个大的依赖树.以下是几个例子:

正如你所看到的那样(我希望),Doxygen/GraphViz似乎在图形变得太大并且使子节点变灰时放弃了.然后,如果我想看看树下面还有什么,我必须转到该特定节点的图表.这不仅限制了图形的视觉效用,而且如果子节点依赖于原始图形中的任何节点,则将再次显示这些节点.这导致了许多重复连接,这使得从任何给定文件概念上隔离图形变得非常困难.结果,我觉得我"放大了",但仍然无法看到整个画面.
我尝试在Doxygen的Expert视图中使用DOT_GRAPH_MAX_NODES设置,但这似乎不会影响正在生成的图形的范围.从任何给定运行产生的输出,似乎Doxygen本身产生了数百个图形文件,而Graphviz只是忠实地为每个图形文件生成图形. 是否有任何已知的方法使Doxygen生成一个大图形文件而不是数百个较小的图形文件?
或者,有没有任何免费的可视化图形解决方案,它们知道如何处理复杂的C++项目文件与嵌套的预处理器指令,MIDL接口和手动定义的包含路径Doxygen的方式?
我的搜索是查找一般图形工具(或有关它们的问题),但没有特定于大型 C++项目.当然,多年来所做的所有编码都必须有这样的工具!
谢谢,-Alex
我想知道什么可能导致Tomcat或本机Java ZipFile.open
方法声称文件实际上不存在?这对我过去一个月的一些工作来说是一个阻碍问题.尝试运行tomcat7-maven-plugin时会发生这种情况.它在包括我的(OSX)在内的大多数机器上运行良好,但在我们的构建服务器(LINUX)和我的同事盒子(OSX,与我的相同型号的笔记本电脑)上都失败了.这是Maven构建中出现的错误:
[INFO] --- tomcat7-maven-plugin:2.2:run (start-tomcat) @ PROJECT ---
[INFO] Running war on http://localhost:8080/contentmain
[INFO] Using existing Tomcat server configuration at
/WORKSPACE/PROJECT/tomcat7
Feb 05, 2015 11:17:53 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal
performance in production environments was not found on the
java.library.path:
/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Feb 05, 2015 11:17:54 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
Feb 05, 2015 11:17:54 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
Feb 05, 2015 11:17:54 PM org.apache.coyote.AbstractProtocol …Run Code Online (Sandbox Code Playgroud) 业内资深人士,
我是大学三年级学生,开始了我的第一个夏季编程实习,而且我在脑海里.我所工作的公司从另一家公司购买了一个巨大的应用程序,自90年代初以来,该公司已经慢慢地扩展和修改它.该解决方案包含超过200,000行代码,分布在300多个文件中.据称整个解决方案都是按照ANSI-C++标准编写的.代码几乎完全没有记录,大部分代码对我来说都是象形文字.最终,我的工作是将此代码移植到嵌入式Linux.目前,我的工作只是在Windows XP上使用Visual Studio 2008进行编译.
今天,我遇到了像这样的链接器错误:
libcmtd.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR90D.dll)
我的理解是,当使用不同的运行时库编译解决方案中的不同项目时,通常会发生这种情况.我的解决方案中有6个项目.其中4个设置为使用多线程调试DLL运行时库(/ MDd)进行编译,其中一个设置为使用多线程调试库(/ MTd)进行编译,其中一个设置为使用多线程DLL运行时库(/ MD).我收到此错误消息后尝试的第一件事是将/ MTd和/ MD开关更改为/ MDd,以便所有内容都使用相同的运行时库进行编译.不幸的是,这导致afx.h中出现以下错误:
fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
经过一番挖掘,我发现它已经告诉我我需要做什么.我继续将项目属性 - >配置属性 - >常规下的"使用MFC"选项更改为"在共享DLL中使用MFC".此时我开始收到许多未解决的外部错误,例如:
dataPropertySheet.obj : error LNK2019: unresolved external symbol "public: __thiscall CResizableSheet::CResizableSheet(unsigned short const *,class CWnd *,unsigned int)" (??0CResizableSheet@@QAE@PBGPAVCWnd@@I@Z) referenced in function "public: __thiscall CdataPropertySheet::CdataPropertySheet(unsigned short const …
我有一个使用Visual Studio 2008构建的非常大的应用程序,它可以在Windows XP上运行.该代码由一个包含六个独立项目的解决方案文件组成.我的工作是将此应用程序移植到Linux上运行.我之前没有做过这样的事.
我昨天发现我的公司希望这个代码在我完成之后仍然可以在Windows上编译.我实现这一目标的第一个想法是使用预处理器语句,例如:
#define COMPILE_FOR_LINUX
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用预处理器块告诉编译器哪些文件包含在头文件中,如下所示:
#ifdef COMPILE_FOR_LINUX
// include required Linux headers here and skip Windows header includes
#else
// include required Windows headers here and skip Linux header includes
#endif
Run Code Online (Sandbox Code Playgroud)
在包含适当的文件之后,我可以使用以下块来封装所有与平台相关的代码:
#ifdef COMPILE_FOR_LINUX
// compile Linux specific code used here.
#else
// compile Windows specific code used here.
#endif
Run Code Online (Sandbox Code Playgroud)
为了让某人能够轻松地为他们的首选平台编译应用程序,我想在一个地方指定COMPILE_FOR_LINUX.但是,我不知道如何做到这一点.
我的一个想法是创建一个空头文件,然后让解决方案中的每个文件都包含Visual Studio解决方案文件包含路径中指定的头文件.对于Linux,我有另一个版本的头文件定义COMPILE_FOR_LINUX,然后让makefile指向这个版本而不是空版本.但是,我确信这是一个非常粗糙的解决方案,我不确定它是否会起作用.
任何人都可以提出一种更优雅的方法来全局定义或创建变量,使解决方案中的每个文件都可以看到它吗?
一般问题: 我正在一家具有面向服务架构的大公司测试 Web 应用程序。由于背景噪音,外部服务在我们的测试环境中经常失败。这会阻止我们服务的集成测试正常运行,因为除非对这些外部服务的调用成功,否则我们的服务将无法工作。出于这个原因,我们希望能够模拟来自外部服务的响应,这样我们就不必依赖它们并且可以单独测试我们自己的服务。
我们希望使用一个名为Mockey的工具。它是一个 Java 程序,通过嵌入式 Jetty 服务器运行并充当服务调用的代理。我们的 Web 应用程序被重新配置为调用 Mockey 而不是外部服务。然后,Mockey 被配置为根据传入的 URL 和标头数据为这些调用提供动态模拟响应。
为了利用这个工具,我们希望能够在 Maven 生命周期的预集成测试阶段启动 Mockey,以便它可以在集成测试阶段使用。
具体问题: 为了在 Maven 生命周期的预集成测试和后集成测试阶段启动和关闭 Mockey,我编写了一个名为 mockey-maven-plugin 的 Maven 3 插件:
mockey-maven-plugin pom.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.mockey</groupId>
<artifactId>mockey-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>1.3</version>
<dependencies>
<!-- Maven plugin dependencies -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
<!-- Mockey dependency -->
<dependency>
<groupId>com.mycompany.mockey</groupId>
<artifactId>Mockey</artifactId>
<version>1.16.2015</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- This plugin …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的 Gitlab 项目(.gitlab-ci.yml):
# Sub-jobs listed as comments
stages:
- check-in-tests
# shellcheck
# pylint
# unit-tests
- several-other-things
# foo
# bar
# baz
- release
# release
# Run some shell code static tests and generate logs/badges
shellcheck:
stage: check-in-tests
script:
- bash run_shellcheck.sh
artifacts:
paths:
- logs/shellcheck.log
- logs/shellcheck.svg
# Run some python code static tests and generate logs/badges
pylint:
stage: check-in-tests
script:
- bash run_pylint.sh
artifacts:
paths:
- logs/pylint.log
- logs/pylint.svg
# <snip>
Run Code Online (Sandbox Code Playgroud)
在我的项目页面上,我想将签入测试期间生成的 .svg 文件呈现为 …
我正在做一些测试工作,需要使用JUnit中我不熟悉的功能.为了更好地理解这些功能,我希望能够在我的项目中查看IntelliJ内部的JUnit源代码.
这个项目使用Maven.我对pom.xml文件中列出的jUnit有以下依赖关系:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当我在命令行上运行"mvn clean install"时,jUnit源从我公司的Maven存储库下载到我的本地Maven存储库(.m2目录).然后该项目编译并运行没有问题.
右键单击pom.xml文件并选择Maven-> Reimport后,我可以看到jUnit的类,源和javadoc也出现在IntelliJ的库设置中:

但是,当我尝试在IntelliJ中打开一个jUnit类文件并单击"下载源"链接时,我看到:

似乎IntelliJ应该在本地找到这些来源.即使它确实必须从我公司的存储库下载它们,我也相信它应该在那里找到它们,因为那是我本地存储库中的junit-4.10-sources.jar文件最初来自的地方.
什么可能使IntelliJ无法加载它已经知道的JAR文件中的源代码?
我正在寻找一个单行代码来替换变量字符串中变量字符串中变量位置的任何字符。我想出了这个工作解决方案:
echo "$string" | sed "s/./${replacement}/${position}"
Run Code Online (Sandbox Code Playgroud)
示例用法:
string=aaaaa
replacement=b
position=3
echo "$string" | sed "s/./${replacement}/${position}"
aabaa
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我使用包含我当前解决方案的脚本运行 shellcheck 时,它告诉我:
SC2001: See if you can use ${variable//search/replace} instead.
Run Code Online (Sandbox Code Playgroud)
我想使用它建议的参数扩展而不是管道到 sed,但我不清楚使用位置变量时的正确格式。在官方文档似乎并没有讨论在所有字符串中的定位。
这可能吗?
仍在经历此处详述的主要编译,但我有一个关于 /NODEFAULTLIB 使用的具体问题。
我一直在尝试使用此 /NODEFAULTLIB:LIBCMTD 开关来解决链接器问题,其中解决方案中的一个项目使用 /MTd (LIBCMTD.LIB) 而不是 /MDd MSVCR90D.DLL。
不幸的是,正如您可能通过这篇文章的标题猜到的那样,我似乎没有正确使用它。构建解决方案后,我在三个地方看到了这个警告:
1>cl : Command line warning D9002 : ignoring unknown option '/NODEFAULTLIB:LIBCMTD'
我在 Windows XP Professional SP3 上运行 Visual Studio 2008 Standard SP1。我通过右键单击麻烦的项目,选择属性,展开“配置属性”,展开 C/C++ 列表,选择“命令行”,并在“附加选项”中输入 /NODEFAULTLIB:LIBCMTD 来添加此开关场地。
我在网上的其他地方读到这应该是链接器设置,而不是 C/C++ 设置,所以我也尝试在配置属性-> 构建事件-> 预链接事件-> 命令行下输入它,不过这给了我自己的警告,而没有从编译中产生任何不同的结果:
1>The filename, directory name, or volume label syntax is incorrect.
1>Project : error PRJ0019: A tool returned an error code from "Performing Pre-Link Event..."
所以伙计们......我在这里不理解 /NODEFAULTLIB 开关怎么样?如何让 VS2008 识别命令并停止忽略它?
谢谢,-亚历克斯
根据Golang导览,我们提供了以下整数类型:
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
Run Code Online (Sandbox Code Playgroud)
从理论上讲,这意味着我们还可以如下指向所有这些类型的指针:
*int *int8 *int16 *int32 *int64
*uint *uint8 *uint16 *uint32 *uint64 *uintptr
Run Code Online (Sandbox Code Playgroud)
如果是这种情况,那么我们已经有一个指向* uint形式的uint的指针。这会使uintptr变得多余。在官方文档不会在此洒下多少光:
uintptr is an integer type that is large enough to hold the bit pattern of any pointer.
Run Code Online (Sandbox Code Playgroud)
据我了解,这意味着uint的位宽是在编译时根据目标体系结构(通常为32位或64位)确定的。指针宽度也应缩放到目标体系结构似乎是合乎逻辑的(IE:32位* uint指向32位uint)。Golang就是这种情况吗?
另一个想法是,也许在添加uintptr时使语法在进行多个间接寻址时(IE:foo *uinptrvs foo **uint)不太混乱?
我最后的想法是,指针和整数在Golang中可能是不兼容的数据类型。这将非常令人沮丧,因为硬件本身在它们之间没有任何区别。例如,“分支到该地址”指令可以使用来自同一寄存器的与“添加此值”指令中相同的数据。
uintptr的真正意义(双关语)是什么?